From ee3ef6d7cc7665f79aa0a471dce4dc9d4168b23f Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 21 Jul 2025 10:19:56 +0200 Subject: [PATCH 01/16] chore: add support for lists in arguments --- .../grpc_datasource/execution_plan.go | 3 + .../grpc_datasource/execution_plan_test.go | 25 +- .../grpc_datasource/execution_plan_visitor.go | 118 +- v2/pkg/grpctest/Makefile | 4 + v2/pkg/grpctest/mockservice.go | 24 +- v2/pkg/grpctest/product.proto | 123 +- v2/pkg/grpctest/productv1/product.pb.go | 2031 +++++++++-------- v2/pkg/grpctest/productv1/product_grpc.pb.go | 458 ++-- 8 files changed, 1506 insertions(+), 1280 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go index 90c19b2280..839f3940f5 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go @@ -14,6 +14,9 @@ const ( // knownTypeOptionalFieldValueName is the name of the field that is used to wrap optional scalar values // in a message as protobuf scalar types are not nullable. knownTypeOptionalFieldValueName = "value" + + // knownListWrapperPrefix is the prefix of the known list wrapper types. + knownListWrapperPrefix = "ListOf" ) // OneOfType represents the type of a oneof field in a protobuf message. diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go index 5cc3e89230..6cbd29da5a 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go @@ -487,6 +487,7 @@ func TestQueryExecutionPlans(t *testing.T) { Name: "user", TypeName: string(DataTypeMessage), JSONPath: "user", + Optional: true, Message: &RPCMessage{ Name: "User", Fields: []RPCField{ @@ -1014,6 +1015,7 @@ func TestQueryExecutionPlans(t *testing.T) { Name: "user", TypeName: string(DataTypeMessage), JSONPath: "user", + Optional: true, Message: &RPCMessage{ Name: "User", Fields: []RPCField{ @@ -1328,9 +1330,20 @@ func TestQueryExecutionPlans(t *testing.T) { }, { Name: "modifiers", - TypeName: string(DataTypeString), - JSONPath: "modifiers", - Repeated: true, + TypeName: string(DataTypeMessage), + Repeated: false, + Optional: true, + Message: &RPCMessage{ + Name: "ListOfString", + Fields: []RPCField{ + { + Name: "items", + TypeName: string(DataTypeString), + Repeated: true, + JSONPath: "modifiers", + }, + }, + }, }, }, }, @@ -2625,6 +2638,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { TypeName: string(DataTypeMessage), JSONPath: "user", Alias: "specificUser", + Optional: true, Message: &RPCMessage{ Name: "User", Fields: RPCFields{ @@ -3187,6 +3201,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { TypeName: string(DataTypeMessage), JSONPath: "user", Alias: "user1", + Optional: true, Message: &RPCMessage{ Name: "User", Fields: RPCFields{ @@ -3228,6 +3243,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { TypeName: string(DataTypeMessage), JSONPath: "user", Alias: "user2", + Optional: true, Message: &RPCMessage{ Name: "User", Fields: RPCFields{ @@ -3269,6 +3285,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { TypeName: string(DataTypeMessage), JSONPath: "user", Alias: "sameUser", + Optional: true, Message: &RPCMessage{ Name: "User", Fields: RPCFields{ @@ -3854,6 +3871,7 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { Name: "nullable_fields_type_by_id", TypeName: string(DataTypeMessage), JSONPath: "nullableFieldsTypeById", + Optional: true, Message: &RPCMessage{ Name: "NullableFieldsType", Fields: []RPCField{ @@ -4149,6 +4167,7 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { Name: "update_nullable_fields_type", TypeName: string(DataTypeMessage), JSONPath: "updateNullableFieldsType", + Optional: true, Message: &RPCMessage{ Name: "NullableFieldsType", Fields: []RPCField{ diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go index ac1dcc7c40..98fbc97edb 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go @@ -335,7 +335,7 @@ func (r *rpcPlanVisitor) EnterField(ref int) { JSONPath: fieldName, Repeated: r.definition.TypeIsList(fdt), Alias: fieldAlias, - Optional: r.isNullableScalar(fdt), + Optional: !r.definition.TypeIsNonNull(fdt), } if typeName == DataTypeEnum { @@ -450,14 +450,18 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i case ast.NodeKindScalarTypeDefinition, ast.NodeKindEnumTypeDefinition: rootNode := r.walker.TypeDefinitions[len(r.walker.TypeDefinitions)-2] baseType := r.definition.NodeNameString(rootNode) - dt := r.toDataType(&r.definition.Types[typeRef]) + dt := DataTypeMessage + if !r.typeIsNullableOrNestedList(typeRef) { + dt = r.toDataType(&r.definition.Types[typeRef]) + } field := RPCField{ Name: r.resolveInputArgument(baseType, r.walker.Ancestor().Ref, fieldName), TypeName: dt.String(), JSONPath: jsonPath, - Repeated: r.definition.TypeIsList(typeRef), - Optional: r.isNullableScalar(typeRef), + Repeated: r.typeIsNonNullList(typeRef), + Optional: !r.definition.TypeIsNonNull(typeRef), + Message: r.buildListMessage(typeRef, baseType, fieldName), } if dt == DataTypeEnum { @@ -473,6 +477,82 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i } } +func (r *rpcPlanVisitor) typeIsNonNullList(typeRef int) bool { + return r.definition.TypeIsList(typeRef) && r.definition.TypeIsNonNull(typeRef) +} + +func (r *rpcPlanVisitor) buildListMessage(typeRef int, graphqlTypeName, jsonPath string) *RPCMessage { + // We only need to build a wrapper message when we are dealing with nullable or nested lists. + if !r.definition.TypeIsList(typeRef) || r.definition.TypeIsNonNull(typeRef) { + return nil + } + + dataType := r.toDataType(&r.definition.Types[typeRef]) + nestingLevel := r.definition.TypeNumberOfListWraps(typeRef) + + rootMessage := &RPCMessage{} + currentMessage := rootMessage + for i := nestingLevel; i > 0; i-- { + // Add the prefix to the name of the current message. + currentMessage.Name = strings.Repeat(knownListWrapperPrefix, i) + graphqlTypeName + if i == 1 { + currentMessage.Fields = RPCFields{ + { + Name: "items", + TypeName: dataType.String(), + Repeated: true, + JSONPath: jsonPath, + }, + } + break + } + + // for nested lists we need to create a new message for each level. + nextMessage := &RPCMessage{} + currentMessage.Fields = RPCFields{ + { + Name: "list", + TypeName: DataTypeMessage.String(), + Message: &RPCMessage{ + Name: "List", + Fields: RPCFields{ + { + Name: "items", + Repeated: true, + TypeName: DataTypeMessage.String(), + Optional: !r.definition.TypeIsNonNull(typeRef), + Message: nextMessage, + }, + }, + }, + }, + } + + // Set the current message to the next message. + currentMessage = nextMessage + // Unwrap the list nesting. + typeRef = r.unwrapListNesting(typeRef) + } + + return rootMessage +} + +func (r *rpcPlanVisitor) unwrapListNesting(typeRef int) int { + if !r.definition.TypeIsList(typeRef) { + return typeRef + } + + if r.definition.TypeIsNonNull(typeRef) { + typeRef = r.definition.Types[typeRef].OfType + } + + if r.definition.Types[typeRef].TypeKind == ast.TypeKindList { + typeRef = r.definition.Types[typeRef].OfType + } + + return typeRef +} + // buildMessageFromNode builds a message structure from an AST node. func (r *rpcPlanVisitor) buildMessageFromNode(node ast.Node) { switch node.Kind { @@ -502,16 +582,21 @@ func (r *rpcPlanVisitor) buildMessageField(fieldName string, typeRef, parentType // If the type is not an object, directly add the field to the request message // TODO: check interfaces, unions, etc. if underlyingTypeNode.Kind != ast.NodeKindInputObjectTypeDefinition { - dt := r.toDataType(&inputValueDefinitionType) - field := RPCField{ Name: r.resolveFieldMapping(parentTypeName, fieldName), - TypeName: dt.String(), - JSONPath: fieldName, - Repeated: r.definition.TypeIsList(typeRef), - Optional: r.isNullableScalar(typeRef), + Repeated: r.typeIsNonNullList(typeRef), + Optional: !r.definition.TypeIsNonNull(typeRef), + Message: r.buildListMessage(typeRef, underlyingTypeName, fieldName), + } + + dt := DataTypeMessage + if !r.typeIsNullableOrNestedList(typeRef) { + field.JSONPath = fieldName + dt = r.toDataType(&inputValueDefinitionType) } + field.TypeName = dt.String() + if dt == DataTypeEnum { field.EnumName = underlyingTypeName } @@ -525,6 +610,7 @@ func (r *rpcPlanVisitor) buildMessageField(fieldName string, typeRef, parentType Name: underlyingTypeName, } + // TODO in case of a list make sure the message ancestor is the last message in the list r.planInfo.currentRequestMessage.Fields = append(r.planInfo.currentRequestMessage.Fields, RPCField{ Name: r.resolveFieldMapping(parentTypeName, fieldName), TypeName: DataTypeMessage.String(), @@ -819,8 +905,16 @@ func (r *rpcPlanVisitor) parseGraphQLType(t *ast.Type) DataType { } } -func (r *rpcPlanVisitor) isNullableScalar(fdt int) bool { - return r.definition.TypeIsScalar(fdt, r.definition) && !r.definition.TypeIsNonNull(fdt) +func (r *rpcPlanVisitor) typeIsNullableOrNestedList(typeRef int) bool { + if !r.definition.TypeIsNonNull(typeRef) && r.definition.TypeIsList(typeRef) { + return true + } + + if r.definition.TypeNumberOfListWraps(typeRef) > 1 { + return true + } + + return false } // titleSlice capitalizes the first letter of each string in a slice. diff --git a/v2/pkg/grpctest/Makefile b/v2/pkg/grpctest/Makefile index 6a73e4a8d1..0c27bf834a 100644 --- a/v2/pkg/grpctest/Makefile +++ b/v2/pkg/grpctest/Makefile @@ -9,6 +9,10 @@ generate-proto: install-protoc --go-grpc_out=productv1 --go-grpc_opt=paths=source_relative \ product.proto +PHONY: build-plugin build-plugin: go build -o plugin/plugin_service plugin/plugin_service.go +PHONY: regenerate-proto +regenerate-proto: + pnpx wgc@latest grpc-service generate -i testdata/products.graphqls -o testdata/ -p productv1 -g "cosmo/pkg/proto/productv1;productv1" Product diff --git a/v2/pkg/grpctest/mockservice.go b/v2/pkg/grpctest/mockservice.go index dd5fc40caa..31b8efd66b 100644 --- a/v2/pkg/grpctest/mockservice.go +++ b/v2/pkg/grpctest/mockservice.go @@ -38,7 +38,7 @@ func (s *MockService) MutationCreateNullableFieldsType(ctx context.Context, in * result.OptionalInt = &wrapperspb.Int32Value{Value: input.OptionalInt.GetValue()} } if input.OptionalFloat != nil { - result.OptionalFloat = &wrapperspb.FloatValue{Value: input.OptionalFloat.GetValue()} + result.OptionalFloat = &wrapperspb.DoubleValue{Value: input.OptionalFloat.GetValue()} } if input.OptionalBoolean != nil { result.OptionalBoolean = &wrapperspb.BoolValue{Value: input.OptionalBoolean.GetValue()} @@ -77,7 +77,7 @@ func (s *MockService) MutationUpdateNullableFieldsType(ctx context.Context, in * result.OptionalInt = &wrapperspb.Int32Value{Value: input.OptionalInt.GetValue()} } if input.OptionalFloat != nil { - result.OptionalFloat = &wrapperspb.FloatValue{Value: input.OptionalFloat.GetValue()} + result.OptionalFloat = &wrapperspb.DoubleValue{Value: input.OptionalFloat.GetValue()} } if input.OptionalBoolean != nil { result.OptionalBoolean = &wrapperspb.BoolValue{Value: input.OptionalBoolean.GetValue()} @@ -100,7 +100,7 @@ func (s *MockService) QueryAllNullableFieldsTypes(ctx context.Context, in *produ Name: "Full Data Entry", OptionalString: &wrapperspb.StringValue{Value: "Optional String Value"}, OptionalInt: &wrapperspb.Int32Value{Value: 42}, - OptionalFloat: &wrapperspb.FloatValue{Value: 3.14}, + OptionalFloat: &wrapperspb.DoubleValue{Value: 3.14}, OptionalBoolean: &wrapperspb.BoolValue{Value: true}, RequiredString: "Required String 1", RequiredInt: 100, @@ -175,7 +175,7 @@ func (s *MockService) QueryNullableFieldsTypeById(ctx context.Context, in *produ Name: "Full Data by ID", OptionalString: &wrapperspb.StringValue{Value: "All fields populated"}, OptionalInt: &wrapperspb.Int32Value{Value: 123}, - OptionalFloat: &wrapperspb.FloatValue{Value: 12.34}, + OptionalFloat: &wrapperspb.DoubleValue{Value: 12.34}, OptionalBoolean: &wrapperspb.BoolValue{Value: false}, RequiredString: "Required by ID", RequiredInt: 456, @@ -209,7 +209,7 @@ func (s *MockService) QueryNullableFieldsTypeById(ctx context.Context, in *produ Name: fmt.Sprintf("Nullable Type %s", id), OptionalString: &wrapperspb.StringValue{Value: fmt.Sprintf("Optional for %s", id)}, OptionalInt: &wrapperspb.Int32Value{Value: int32(len(id) * 10)}, - OptionalFloat: &wrapperspb.FloatValue{Value: float32(len(id)) * 1.5}, + OptionalFloat: &wrapperspb.DoubleValue{Value: float64(len(id)) * 1.5}, OptionalBoolean: &wrapperspb.BoolValue{Value: len(id)%2 == 0}, RequiredString: fmt.Sprintf("Required for %s", id), RequiredInt: int32(len(id) * 100), @@ -253,7 +253,7 @@ func (s *MockService) QueryNullableFieldsTypeWithFilter(ctx context.Context, in for i := 1; i <= 3; i++ { var optionalString *wrapperspb.StringValue var optionalInt *wrapperspb.Int32Value - var optionalFloat *wrapperspb.FloatValue + var optionalFloat *wrapperspb.DoubleValue var optionalBoolean *wrapperspb.BoolValue // Vary the nullable fields based on includeNulls and index @@ -270,7 +270,7 @@ func (s *MockService) QueryNullableFieldsTypeWithFilter(ctx context.Context, in } if includeNulls || i%2 == 0 { - optionalFloat = &wrapperspb.FloatValue{Value: float32(i) * 10.5} + optionalFloat = &wrapperspb.DoubleValue{Value: float64(i) * 10.5} } if includeNulls || i%4 != 0 { @@ -397,14 +397,14 @@ func (s *MockService) QuerySearch(ctx context.Context, in *productv1.QuerySearch limit := input.GetLimit() // Default limit if not specified - if limit <= 0 { - limit = 10 + if limit.GetValue() <= 0 { + limit = &wrapperspb.Int32Value{Value: 10} } var results []*productv1.SearchResult // Generate a mix of different union types based on the query - for i := int32(0); i < limit && i < 6; i++ { // Cap at 6 results for testing + for i := int32(0); i < limit.GetValue() && i < 6; i++ { // Cap at 6 results for testing switch i % 3 { case 0: // Add a Product @@ -850,7 +850,9 @@ func (s *MockService) QueryCalculateTotals(ctx context.Context, in *productv1.Qu OrderId: orderInput.GetOrderId(), CustomerName: orderInput.GetCustomerName(), TotalItems: totalItems, - OrderLines: orderLines, + OrderLines: &productv1.ListOfOrderLine{ + Items: orderLines, + }, }) } diff --git a/v2/pkg/grpctest/product.proto b/v2/pkg/grpctest/product.proto index 65876625ce..29c0a6056b 100644 --- a/v2/pkg/grpctest/product.proto +++ b/v2/pkg/grpctest/product.proto @@ -1,18 +1,21 @@ syntax = "proto3"; package productv1; -import "google/protobuf/wrappers.proto"; - option go_package = "cosmo/pkg/proto/productv1;productv1"; +import "google/protobuf/wrappers.proto"; + // Service definition for ProductService service ProductService { // Lookup Product entity by id rpc LookupProductById(LookupProductByIdRequest) returns (LookupProductByIdResponse) {} // Lookup Storage entity by id rpc LookupStorageById(LookupStorageByIdRequest) returns (LookupStorageByIdResponse) {} + rpc MutationCreateNullableFieldsType(MutationCreateNullableFieldsTypeRequest) returns (MutationCreateNullableFieldsTypeResponse) {} rpc MutationCreateUser(MutationCreateUserRequest) returns (MutationCreateUserResponse) {} rpc MutationPerformAction(MutationPerformActionRequest) returns (MutationPerformActionResponse) {} + rpc MutationUpdateNullableFieldsType(MutationUpdateNullableFieldsTypeRequest) returns (MutationUpdateNullableFieldsTypeResponse) {} + rpc QueryAllNullableFieldsTypes(QueryAllNullableFieldsTypesRequest) returns (QueryAllNullableFieldsTypesResponse) {} rpc QueryAllPets(QueryAllPetsRequest) returns (QueryAllPetsResponse) {} rpc QueryCalculateTotals(QueryCalculateTotalsRequest) returns (QueryCalculateTotalsResponse) {} rpc QueryCategories(QueryCategoriesRequest) returns (QueryCategoriesResponse) {} @@ -21,6 +24,9 @@ service ProductService { rpc QueryComplexFilterType(QueryComplexFilterTypeRequest) returns (QueryComplexFilterTypeResponse) {} rpc QueryFilterCategories(QueryFilterCategoriesRequest) returns (QueryFilterCategoriesResponse) {} rpc QueryNestedType(QueryNestedTypeRequest) returns (QueryNestedTypeResponse) {} + rpc QueryNullableFieldsType(QueryNullableFieldsTypeRequest) returns (QueryNullableFieldsTypeResponse) {} + rpc QueryNullableFieldsTypeById(QueryNullableFieldsTypeByIdRequest) returns (QueryNullableFieldsTypeByIdResponse) {} + rpc QueryNullableFieldsTypeWithFilter(QueryNullableFieldsTypeWithFilterRequest) returns (QueryNullableFieldsTypeWithFilterResponse) {} rpc QueryRandomPet(QueryRandomPetRequest) returns (QueryRandomPetResponse) {} rpc QueryRandomSearchResult(QueryRandomSearchResultRequest) returns (QueryRandomSearchResultResponse) {} rpc QueryRecursiveType(QueryRecursiveTypeRequest) returns (QueryRecursiveTypeResponse) {} @@ -29,13 +35,16 @@ service ProductService { rpc QueryTypeWithMultipleFilterFields(QueryTypeWithMultipleFilterFieldsRequest) returns (QueryTypeWithMultipleFilterFieldsResponse) {} rpc QueryUser(QueryUserRequest) returns (QueryUserResponse) {} rpc QueryUsers(QueryUsersRequest) returns (QueryUsersResponse) {} - // Nullable fields RPCs - rpc QueryNullableFieldsType(QueryNullableFieldsTypeRequest) returns (QueryNullableFieldsTypeResponse) {} - rpc QueryNullableFieldsTypeById(QueryNullableFieldsTypeByIdRequest) returns (QueryNullableFieldsTypeByIdResponse) {} - rpc QueryNullableFieldsTypeWithFilter(QueryNullableFieldsTypeWithFilterRequest) returns (QueryNullableFieldsTypeWithFilterResponse) {} - rpc QueryAllNullableFieldsTypes(QueryAllNullableFieldsTypesRequest) returns (QueryAllNullableFieldsTypesResponse) {} - rpc MutationCreateNullableFieldsType(MutationCreateNullableFieldsTypeRequest) returns (MutationCreateNullableFieldsTypeResponse) {} - rpc MutationUpdateNullableFieldsType(MutationUpdateNullableFieldsTypeRequest) returns (MutationUpdateNullableFieldsTypeResponse) {} +} + +// Wrapper message for a list of OrderLine. +message ListOfOrderLine { + repeated OrderLine items = 1; +} + +// Wrapper message for a list of String. +message ListOfString { + repeated string items = 1; } // Key message for Product entity lookup @@ -228,23 +237,6 @@ message QueryRandomSearchResultRequest { message QueryRandomSearchResultResponse { SearchResult random_search_result = 1; } -// Request message for createUser operation. -message MutationCreateUserRequest { - UserInput input = 1; -} -// Response message for createUser operation. -message MutationCreateUserResponse { - User create_user = 1; -} -// Request message for performAction operation. -message MutationPerformActionRequest { - ActionInput input = 1; -} -// Response message for performAction operation. -message MutationPerformActionResponse { - ActionResult perform_action = 1; -} - // Request message for nullableFieldsType operation. message QueryNullableFieldsTypeRequest { } @@ -275,6 +267,22 @@ message QueryAllNullableFieldsTypesRequest { message QueryAllNullableFieldsTypesResponse { repeated NullableFieldsType all_nullable_fields_types = 1; } +// Request message for createUser operation. +message MutationCreateUserRequest { + UserInput input = 1; +} +// Response message for createUser operation. +message MutationCreateUserResponse { + User create_user = 1; +} +// Request message for performAction operation. +message MutationPerformActionRequest { + ActionInput input = 1; +} +// Response message for performAction operation. +message MutationPerformActionResponse { + ActionResult perform_action = 1; +} // Request message for createNullableFieldsType operation. message MutationCreateNullableFieldsTypeRequest { NullableFieldsInput input = 1; @@ -353,7 +361,7 @@ message Order { string order_id = 1; string customer_name = 2; int32 total_items = 3; - repeated OrderLine order_lines = 4; + ListOfOrderLine order_lines = 4; } message Category { @@ -376,7 +384,7 @@ message Animal { message SearchInput { string query = 1; - int32 limit = 2; + google.protobuf.Int32Value limit = 2; } message SearchResult { @@ -387,6 +395,23 @@ message SearchResult { } } +message NullableFieldsType { + string id = 1; + string name = 2; + google.protobuf.StringValue optional_string = 3; + google.protobuf.Int32Value optional_int = 4; + google.protobuf.DoubleValue optional_float = 5; + google.protobuf.BoolValue optional_boolean = 6; + string required_string = 7; + int32 required_int = 8; +} + +message NullableFieldsFilter { + google.protobuf.StringValue name = 1; + google.protobuf.StringValue optional_string = 2; + google.protobuf.BoolValue include_nulls = 3; +} + message UserInput { string name = 1; } @@ -403,6 +428,16 @@ message ActionResult { } } +message NullableFieldsInput { + string name = 1; + google.protobuf.StringValue optional_string = 2; + google.protobuf.Int32Value optional_int = 3; + google.protobuf.DoubleValue optional_float = 4; + google.protobuf.BoolValue optional_boolean = 5; + string required_string = 6; + int32 required_int = 7; +} + message NestedTypeB { string id = 1; string name = 2; @@ -429,13 +464,13 @@ message Pagination { message OrderLineInput { string product_id = 1; int32 quantity = 2; - repeated string modifiers = 3; + ListOfString modifiers = 3; } message OrderLine { string product_id = 1; int32 quantity = 2; - repeated string modifiers = 3; + ListOfString modifiers = 3; } enum CategoryKind { @@ -468,32 +503,4 @@ message ActionSuccess { message ActionError { string message = 1; string code = 2; -} - -// New messages for testing nullable fields -message NullableFieldsType { - string id = 1; - string name = 2; - google.protobuf.StringValue optional_string = 3; - google.protobuf.Int32Value optional_int = 4; - google.protobuf.FloatValue optional_float = 5; - google.protobuf.BoolValue optional_boolean = 6; - string required_string = 7; - int32 required_int = 8; -} - -message NullableFieldsInput { - string name = 1; - google.protobuf.StringValue optional_string = 2; - google.protobuf.Int32Value optional_int = 3; - google.protobuf.FloatValue optional_float = 4; - google.protobuf.BoolValue optional_boolean = 5; - string required_string = 6; - int32 required_int = 7; -} - -message NullableFieldsFilter { - google.protobuf.StringValue name = 1; - google.protobuf.StringValue optional_string = 2; - google.protobuf.BoolValue include_nulls = 3; } \ No newline at end of file diff --git a/v2/pkg/grpctest/productv1/product.pb.go b/v2/pkg/grpctest/productv1/product.pb.go index dcfee5f0ca..47f65281a7 100644 --- a/v2/pkg/grpctest/productv1/product.pb.go +++ b/v2/pkg/grpctest/productv1/product.pb.go @@ -77,6 +77,96 @@ func (CategoryKind) EnumDescriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{0} } +// Wrapper message for a list of OrderLine. +type ListOfOrderLine struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*OrderLine `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfOrderLine) Reset() { + *x = ListOfOrderLine{} + mi := &file_product_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfOrderLine) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfOrderLine) ProtoMessage() {} + +func (x *ListOfOrderLine) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfOrderLine.ProtoReflect.Descriptor instead. +func (*ListOfOrderLine) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{0} +} + +func (x *ListOfOrderLine) GetItems() []*OrderLine { + if x != nil { + return x.Items + } + return nil +} + +// Wrapper message for a list of String. +type ListOfString struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []string `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfString) Reset() { + *x = ListOfString{} + mi := &file_product_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfString) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfString) ProtoMessage() {} + +func (x *ListOfString) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfString.ProtoReflect.Descriptor instead. +func (*ListOfString) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{1} +} + +func (x *ListOfString) GetItems() []string { + if x != nil { + return x.Items + } + return nil +} + // Key message for Product entity lookup type LookupProductByIdRequestKey struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -88,7 +178,7 @@ type LookupProductByIdRequestKey struct { func (x *LookupProductByIdRequestKey) Reset() { *x = LookupProductByIdRequestKey{} - mi := &file_product_proto_msgTypes[0] + mi := &file_product_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -100,7 +190,7 @@ func (x *LookupProductByIdRequestKey) String() string { func (*LookupProductByIdRequestKey) ProtoMessage() {} func (x *LookupProductByIdRequestKey) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[0] + mi := &file_product_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -113,7 +203,7 @@ func (x *LookupProductByIdRequestKey) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdRequestKey.ProtoReflect.Descriptor instead. func (*LookupProductByIdRequestKey) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{0} + return file_product_proto_rawDescGZIP(), []int{2} } func (x *LookupProductByIdRequestKey) GetId() string { @@ -135,7 +225,7 @@ type LookupProductByIdRequest struct { func (x *LookupProductByIdRequest) Reset() { *x = LookupProductByIdRequest{} - mi := &file_product_proto_msgTypes[1] + mi := &file_product_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -147,7 +237,7 @@ func (x *LookupProductByIdRequest) String() string { func (*LookupProductByIdRequest) ProtoMessage() {} func (x *LookupProductByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[1] + mi := &file_product_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -160,7 +250,7 @@ func (x *LookupProductByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdRequest.ProtoReflect.Descriptor instead. func (*LookupProductByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{1} + return file_product_proto_rawDescGZIP(), []int{3} } func (x *LookupProductByIdRequest) GetKeys() []*LookupProductByIdRequestKey { @@ -193,7 +283,7 @@ type LookupProductByIdResponse struct { func (x *LookupProductByIdResponse) Reset() { *x = LookupProductByIdResponse{} - mi := &file_product_proto_msgTypes[2] + mi := &file_product_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -205,7 +295,7 @@ func (x *LookupProductByIdResponse) String() string { func (*LookupProductByIdResponse) ProtoMessage() {} func (x *LookupProductByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[2] + mi := &file_product_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -218,7 +308,7 @@ func (x *LookupProductByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdResponse.ProtoReflect.Descriptor instead. func (*LookupProductByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{2} + return file_product_proto_rawDescGZIP(), []int{4} } func (x *LookupProductByIdResponse) GetResult() []*Product { @@ -239,7 +329,7 @@ type LookupStorageByIdRequestKey struct { func (x *LookupStorageByIdRequestKey) Reset() { *x = LookupStorageByIdRequestKey{} - mi := &file_product_proto_msgTypes[3] + mi := &file_product_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -251,7 +341,7 @@ func (x *LookupStorageByIdRequestKey) String() string { func (*LookupStorageByIdRequestKey) ProtoMessage() {} func (x *LookupStorageByIdRequestKey) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[3] + mi := &file_product_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -264,7 +354,7 @@ func (x *LookupStorageByIdRequestKey) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdRequestKey.ProtoReflect.Descriptor instead. func (*LookupStorageByIdRequestKey) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{3} + return file_product_proto_rawDescGZIP(), []int{5} } func (x *LookupStorageByIdRequestKey) GetId() string { @@ -286,7 +376,7 @@ type LookupStorageByIdRequest struct { func (x *LookupStorageByIdRequest) Reset() { *x = LookupStorageByIdRequest{} - mi := &file_product_proto_msgTypes[4] + mi := &file_product_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -298,7 +388,7 @@ func (x *LookupStorageByIdRequest) String() string { func (*LookupStorageByIdRequest) ProtoMessage() {} func (x *LookupStorageByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[4] + mi := &file_product_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -311,7 +401,7 @@ func (x *LookupStorageByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdRequest.ProtoReflect.Descriptor instead. func (*LookupStorageByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{4} + return file_product_proto_rawDescGZIP(), []int{6} } func (x *LookupStorageByIdRequest) GetKeys() []*LookupStorageByIdRequestKey { @@ -344,7 +434,7 @@ type LookupStorageByIdResponse struct { func (x *LookupStorageByIdResponse) Reset() { *x = LookupStorageByIdResponse{} - mi := &file_product_proto_msgTypes[5] + mi := &file_product_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -356,7 +446,7 @@ func (x *LookupStorageByIdResponse) String() string { func (*LookupStorageByIdResponse) ProtoMessage() {} func (x *LookupStorageByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[5] + mi := &file_product_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -369,7 +459,7 @@ func (x *LookupStorageByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdResponse.ProtoReflect.Descriptor instead. func (*LookupStorageByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{5} + return file_product_proto_rawDescGZIP(), []int{7} } func (x *LookupStorageByIdResponse) GetResult() []*Storage { @@ -388,7 +478,7 @@ type QueryUsersRequest struct { func (x *QueryUsersRequest) Reset() { *x = QueryUsersRequest{} - mi := &file_product_proto_msgTypes[6] + mi := &file_product_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -400,7 +490,7 @@ func (x *QueryUsersRequest) String() string { func (*QueryUsersRequest) ProtoMessage() {} func (x *QueryUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[6] + mi := &file_product_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -413,7 +503,7 @@ func (x *QueryUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUsersRequest.ProtoReflect.Descriptor instead. func (*QueryUsersRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{6} + return file_product_proto_rawDescGZIP(), []int{8} } // Response message for users operation. @@ -426,7 +516,7 @@ type QueryUsersResponse struct { func (x *QueryUsersResponse) Reset() { *x = QueryUsersResponse{} - mi := &file_product_proto_msgTypes[7] + mi := &file_product_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -438,7 +528,7 @@ func (x *QueryUsersResponse) String() string { func (*QueryUsersResponse) ProtoMessage() {} func (x *QueryUsersResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[7] + mi := &file_product_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -451,7 +541,7 @@ func (x *QueryUsersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUsersResponse.ProtoReflect.Descriptor instead. func (*QueryUsersResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{7} + return file_product_proto_rawDescGZIP(), []int{9} } func (x *QueryUsersResponse) GetUsers() []*User { @@ -471,7 +561,7 @@ type QueryUserRequest struct { func (x *QueryUserRequest) Reset() { *x = QueryUserRequest{} - mi := &file_product_proto_msgTypes[8] + mi := &file_product_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -483,7 +573,7 @@ func (x *QueryUserRequest) String() string { func (*QueryUserRequest) ProtoMessage() {} func (x *QueryUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[8] + mi := &file_product_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -496,7 +586,7 @@ func (x *QueryUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUserRequest.ProtoReflect.Descriptor instead. func (*QueryUserRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{8} + return file_product_proto_rawDescGZIP(), []int{10} } func (x *QueryUserRequest) GetId() string { @@ -516,7 +606,7 @@ type QueryUserResponse struct { func (x *QueryUserResponse) Reset() { *x = QueryUserResponse{} - mi := &file_product_proto_msgTypes[9] + mi := &file_product_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -528,7 +618,7 @@ func (x *QueryUserResponse) String() string { func (*QueryUserResponse) ProtoMessage() {} func (x *QueryUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[9] + mi := &file_product_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -541,7 +631,7 @@ func (x *QueryUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUserResponse.ProtoReflect.Descriptor instead. func (*QueryUserResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{9} + return file_product_proto_rawDescGZIP(), []int{11} } func (x *QueryUserResponse) GetUser() *User { @@ -560,7 +650,7 @@ type QueryNestedTypeRequest struct { func (x *QueryNestedTypeRequest) Reset() { *x = QueryNestedTypeRequest{} - mi := &file_product_proto_msgTypes[10] + mi := &file_product_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -572,7 +662,7 @@ func (x *QueryNestedTypeRequest) String() string { func (*QueryNestedTypeRequest) ProtoMessage() {} func (x *QueryNestedTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[10] + mi := &file_product_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -585,7 +675,7 @@ func (x *QueryNestedTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNestedTypeRequest.ProtoReflect.Descriptor instead. func (*QueryNestedTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{10} + return file_product_proto_rawDescGZIP(), []int{12} } // Response message for nestedType operation. @@ -598,7 +688,7 @@ type QueryNestedTypeResponse struct { func (x *QueryNestedTypeResponse) Reset() { *x = QueryNestedTypeResponse{} - mi := &file_product_proto_msgTypes[11] + mi := &file_product_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -610,7 +700,7 @@ func (x *QueryNestedTypeResponse) String() string { func (*QueryNestedTypeResponse) ProtoMessage() {} func (x *QueryNestedTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[11] + mi := &file_product_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -623,7 +713,7 @@ func (x *QueryNestedTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNestedTypeResponse.ProtoReflect.Descriptor instead. func (*QueryNestedTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{11} + return file_product_proto_rawDescGZIP(), []int{13} } func (x *QueryNestedTypeResponse) GetNestedType() []*NestedTypeA { @@ -642,7 +732,7 @@ type QueryRecursiveTypeRequest struct { func (x *QueryRecursiveTypeRequest) Reset() { *x = QueryRecursiveTypeRequest{} - mi := &file_product_proto_msgTypes[12] + mi := &file_product_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -654,7 +744,7 @@ func (x *QueryRecursiveTypeRequest) String() string { func (*QueryRecursiveTypeRequest) ProtoMessage() {} func (x *QueryRecursiveTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[12] + mi := &file_product_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -667,7 +757,7 @@ func (x *QueryRecursiveTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRecursiveTypeRequest.ProtoReflect.Descriptor instead. func (*QueryRecursiveTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{12} + return file_product_proto_rawDescGZIP(), []int{14} } // Response message for recursiveType operation. @@ -680,7 +770,7 @@ type QueryRecursiveTypeResponse struct { func (x *QueryRecursiveTypeResponse) Reset() { *x = QueryRecursiveTypeResponse{} - mi := &file_product_proto_msgTypes[13] + mi := &file_product_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -692,7 +782,7 @@ func (x *QueryRecursiveTypeResponse) String() string { func (*QueryRecursiveTypeResponse) ProtoMessage() {} func (x *QueryRecursiveTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[13] + mi := &file_product_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -705,7 +795,7 @@ func (x *QueryRecursiveTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRecursiveTypeResponse.ProtoReflect.Descriptor instead. func (*QueryRecursiveTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{13} + return file_product_proto_rawDescGZIP(), []int{15} } func (x *QueryRecursiveTypeResponse) GetRecursiveType() *RecursiveType { @@ -726,7 +816,7 @@ type QueryTypeFilterWithArgumentsRequest struct { func (x *QueryTypeFilterWithArgumentsRequest) Reset() { *x = QueryTypeFilterWithArgumentsRequest{} - mi := &file_product_proto_msgTypes[14] + mi := &file_product_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -738,7 +828,7 @@ func (x *QueryTypeFilterWithArgumentsRequest) String() string { func (*QueryTypeFilterWithArgumentsRequest) ProtoMessage() {} func (x *QueryTypeFilterWithArgumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[14] + mi := &file_product_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -751,7 +841,7 @@ func (x *QueryTypeFilterWithArgumentsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryTypeFilterWithArgumentsRequest.ProtoReflect.Descriptor instead. func (*QueryTypeFilterWithArgumentsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{14} + return file_product_proto_rawDescGZIP(), []int{16} } func (x *QueryTypeFilterWithArgumentsRequest) GetFilterField_1() string { @@ -778,7 +868,7 @@ type QueryTypeFilterWithArgumentsResponse struct { func (x *QueryTypeFilterWithArgumentsResponse) Reset() { *x = QueryTypeFilterWithArgumentsResponse{} - mi := &file_product_proto_msgTypes[15] + mi := &file_product_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -790,7 +880,7 @@ func (x *QueryTypeFilterWithArgumentsResponse) String() string { func (*QueryTypeFilterWithArgumentsResponse) ProtoMessage() {} func (x *QueryTypeFilterWithArgumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[15] + mi := &file_product_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -803,7 +893,7 @@ func (x *QueryTypeFilterWithArgumentsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use QueryTypeFilterWithArgumentsResponse.ProtoReflect.Descriptor instead. func (*QueryTypeFilterWithArgumentsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{15} + return file_product_proto_rawDescGZIP(), []int{17} } func (x *QueryTypeFilterWithArgumentsResponse) GetTypeFilterWithArguments() []*TypeWithMultipleFilterFields { @@ -823,7 +913,7 @@ type QueryTypeWithMultipleFilterFieldsRequest struct { func (x *QueryTypeWithMultipleFilterFieldsRequest) Reset() { *x = QueryTypeWithMultipleFilterFieldsRequest{} - mi := &file_product_proto_msgTypes[16] + mi := &file_product_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -835,7 +925,7 @@ func (x *QueryTypeWithMultipleFilterFieldsRequest) String() string { func (*QueryTypeWithMultipleFilterFieldsRequest) ProtoMessage() {} func (x *QueryTypeWithMultipleFilterFieldsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[16] + mi := &file_product_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -848,7 +938,7 @@ func (x *QueryTypeWithMultipleFilterFieldsRequest) ProtoReflect() protoreflect.M // Deprecated: Use QueryTypeWithMultipleFilterFieldsRequest.ProtoReflect.Descriptor instead. func (*QueryTypeWithMultipleFilterFieldsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{16} + return file_product_proto_rawDescGZIP(), []int{18} } func (x *QueryTypeWithMultipleFilterFieldsRequest) GetFilter() *FilterTypeInput { @@ -868,7 +958,7 @@ type QueryTypeWithMultipleFilterFieldsResponse struct { func (x *QueryTypeWithMultipleFilterFieldsResponse) Reset() { *x = QueryTypeWithMultipleFilterFieldsResponse{} - mi := &file_product_proto_msgTypes[17] + mi := &file_product_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -880,7 +970,7 @@ func (x *QueryTypeWithMultipleFilterFieldsResponse) String() string { func (*QueryTypeWithMultipleFilterFieldsResponse) ProtoMessage() {} func (x *QueryTypeWithMultipleFilterFieldsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[17] + mi := &file_product_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -893,7 +983,7 @@ func (x *QueryTypeWithMultipleFilterFieldsResponse) ProtoReflect() protoreflect. // Deprecated: Use QueryTypeWithMultipleFilterFieldsResponse.ProtoReflect.Descriptor instead. func (*QueryTypeWithMultipleFilterFieldsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{17} + return file_product_proto_rawDescGZIP(), []int{19} } func (x *QueryTypeWithMultipleFilterFieldsResponse) GetTypeWithMultipleFilterFields() []*TypeWithMultipleFilterFields { @@ -913,7 +1003,7 @@ type QueryComplexFilterTypeRequest struct { func (x *QueryComplexFilterTypeRequest) Reset() { *x = QueryComplexFilterTypeRequest{} - mi := &file_product_proto_msgTypes[18] + mi := &file_product_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -925,7 +1015,7 @@ func (x *QueryComplexFilterTypeRequest) String() string { func (*QueryComplexFilterTypeRequest) ProtoMessage() {} func (x *QueryComplexFilterTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[18] + mi := &file_product_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -938,7 +1028,7 @@ func (x *QueryComplexFilterTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryComplexFilterTypeRequest.ProtoReflect.Descriptor instead. func (*QueryComplexFilterTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{18} + return file_product_proto_rawDescGZIP(), []int{20} } func (x *QueryComplexFilterTypeRequest) GetFilter() *ComplexFilterTypeInput { @@ -958,7 +1048,7 @@ type QueryComplexFilterTypeResponse struct { func (x *QueryComplexFilterTypeResponse) Reset() { *x = QueryComplexFilterTypeResponse{} - mi := &file_product_proto_msgTypes[19] + mi := &file_product_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -970,7 +1060,7 @@ func (x *QueryComplexFilterTypeResponse) String() string { func (*QueryComplexFilterTypeResponse) ProtoMessage() {} func (x *QueryComplexFilterTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[19] + mi := &file_product_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -983,7 +1073,7 @@ func (x *QueryComplexFilterTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryComplexFilterTypeResponse.ProtoReflect.Descriptor instead. func (*QueryComplexFilterTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{19} + return file_product_proto_rawDescGZIP(), []int{21} } func (x *QueryComplexFilterTypeResponse) GetComplexFilterType() []*TypeWithComplexFilterInput { @@ -1003,7 +1093,7 @@ type QueryCalculateTotalsRequest struct { func (x *QueryCalculateTotalsRequest) Reset() { *x = QueryCalculateTotalsRequest{} - mi := &file_product_proto_msgTypes[20] + mi := &file_product_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1015,7 +1105,7 @@ func (x *QueryCalculateTotalsRequest) String() string { func (*QueryCalculateTotalsRequest) ProtoMessage() {} func (x *QueryCalculateTotalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[20] + mi := &file_product_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1028,7 +1118,7 @@ func (x *QueryCalculateTotalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCalculateTotalsRequest.ProtoReflect.Descriptor instead. func (*QueryCalculateTotalsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{20} + return file_product_proto_rawDescGZIP(), []int{22} } func (x *QueryCalculateTotalsRequest) GetOrders() []*OrderInput { @@ -1048,7 +1138,7 @@ type QueryCalculateTotalsResponse struct { func (x *QueryCalculateTotalsResponse) Reset() { *x = QueryCalculateTotalsResponse{} - mi := &file_product_proto_msgTypes[21] + mi := &file_product_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1060,7 +1150,7 @@ func (x *QueryCalculateTotalsResponse) String() string { func (*QueryCalculateTotalsResponse) ProtoMessage() {} func (x *QueryCalculateTotalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[21] + mi := &file_product_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1073,7 +1163,7 @@ func (x *QueryCalculateTotalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCalculateTotalsResponse.ProtoReflect.Descriptor instead. func (*QueryCalculateTotalsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{21} + return file_product_proto_rawDescGZIP(), []int{23} } func (x *QueryCalculateTotalsResponse) GetCalculateTotals() []*Order { @@ -1092,7 +1182,7 @@ type QueryCategoriesRequest struct { func (x *QueryCategoriesRequest) Reset() { *x = QueryCategoriesRequest{} - mi := &file_product_proto_msgTypes[22] + mi := &file_product_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1104,7 +1194,7 @@ func (x *QueryCategoriesRequest) String() string { func (*QueryCategoriesRequest) ProtoMessage() {} func (x *QueryCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[22] + mi := &file_product_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1117,7 +1207,7 @@ func (x *QueryCategoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{22} + return file_product_proto_rawDescGZIP(), []int{24} } // Response message for categories operation. @@ -1130,7 +1220,7 @@ type QueryCategoriesResponse struct { func (x *QueryCategoriesResponse) Reset() { *x = QueryCategoriesResponse{} - mi := &file_product_proto_msgTypes[23] + mi := &file_product_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1142,7 +1232,7 @@ func (x *QueryCategoriesResponse) String() string { func (*QueryCategoriesResponse) ProtoMessage() {} func (x *QueryCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[23] + mi := &file_product_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1155,7 +1245,7 @@ func (x *QueryCategoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{23} + return file_product_proto_rawDescGZIP(), []int{25} } func (x *QueryCategoriesResponse) GetCategories() []*Category { @@ -1175,7 +1265,7 @@ type QueryCategoriesByKindRequest struct { func (x *QueryCategoriesByKindRequest) Reset() { *x = QueryCategoriesByKindRequest{} - mi := &file_product_proto_msgTypes[24] + mi := &file_product_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1187,7 +1277,7 @@ func (x *QueryCategoriesByKindRequest) String() string { func (*QueryCategoriesByKindRequest) ProtoMessage() {} func (x *QueryCategoriesByKindRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[24] + mi := &file_product_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1200,7 +1290,7 @@ func (x *QueryCategoriesByKindRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{24} + return file_product_proto_rawDescGZIP(), []int{26} } func (x *QueryCategoriesByKindRequest) GetKind() CategoryKind { @@ -1220,7 +1310,7 @@ type QueryCategoriesByKindResponse struct { func (x *QueryCategoriesByKindResponse) Reset() { *x = QueryCategoriesByKindResponse{} - mi := &file_product_proto_msgTypes[25] + mi := &file_product_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1232,7 +1322,7 @@ func (x *QueryCategoriesByKindResponse) String() string { func (*QueryCategoriesByKindResponse) ProtoMessage() {} func (x *QueryCategoriesByKindResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[25] + mi := &file_product_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1245,7 +1335,7 @@ func (x *QueryCategoriesByKindResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{25} + return file_product_proto_rawDescGZIP(), []int{27} } func (x *QueryCategoriesByKindResponse) GetCategoriesByKind() []*Category { @@ -1265,7 +1355,7 @@ type QueryCategoriesByKindsRequest struct { func (x *QueryCategoriesByKindsRequest) Reset() { *x = QueryCategoriesByKindsRequest{} - mi := &file_product_proto_msgTypes[26] + mi := &file_product_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1277,7 +1367,7 @@ func (x *QueryCategoriesByKindsRequest) String() string { func (*QueryCategoriesByKindsRequest) ProtoMessage() {} func (x *QueryCategoriesByKindsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[26] + mi := &file_product_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1290,7 +1380,7 @@ func (x *QueryCategoriesByKindsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindsRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{26} + return file_product_proto_rawDescGZIP(), []int{28} } func (x *QueryCategoriesByKindsRequest) GetKinds() []CategoryKind { @@ -1310,7 +1400,7 @@ type QueryCategoriesByKindsResponse struct { func (x *QueryCategoriesByKindsResponse) Reset() { *x = QueryCategoriesByKindsResponse{} - mi := &file_product_proto_msgTypes[27] + mi := &file_product_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1322,7 +1412,7 @@ func (x *QueryCategoriesByKindsResponse) String() string { func (*QueryCategoriesByKindsResponse) ProtoMessage() {} func (x *QueryCategoriesByKindsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[27] + mi := &file_product_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1335,7 +1425,7 @@ func (x *QueryCategoriesByKindsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindsResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{27} + return file_product_proto_rawDescGZIP(), []int{29} } func (x *QueryCategoriesByKindsResponse) GetCategoriesByKinds() []*Category { @@ -1355,7 +1445,7 @@ type QueryFilterCategoriesRequest struct { func (x *QueryFilterCategoriesRequest) Reset() { *x = QueryFilterCategoriesRequest{} - mi := &file_product_proto_msgTypes[28] + mi := &file_product_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1367,7 +1457,7 @@ func (x *QueryFilterCategoriesRequest) String() string { func (*QueryFilterCategoriesRequest) ProtoMessage() {} func (x *QueryFilterCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[28] + mi := &file_product_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1380,7 +1470,7 @@ func (x *QueryFilterCategoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFilterCategoriesRequest.ProtoReflect.Descriptor instead. func (*QueryFilterCategoriesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{28} + return file_product_proto_rawDescGZIP(), []int{30} } func (x *QueryFilterCategoriesRequest) GetFilter() *CategoryFilter { @@ -1400,7 +1490,7 @@ type QueryFilterCategoriesResponse struct { func (x *QueryFilterCategoriesResponse) Reset() { *x = QueryFilterCategoriesResponse{} - mi := &file_product_proto_msgTypes[29] + mi := &file_product_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1412,7 +1502,7 @@ func (x *QueryFilterCategoriesResponse) String() string { func (*QueryFilterCategoriesResponse) ProtoMessage() {} func (x *QueryFilterCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[29] + mi := &file_product_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1425,7 +1515,7 @@ func (x *QueryFilterCategoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFilterCategoriesResponse.ProtoReflect.Descriptor instead. func (*QueryFilterCategoriesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{29} + return file_product_proto_rawDescGZIP(), []int{31} } func (x *QueryFilterCategoriesResponse) GetFilterCategories() []*Category { @@ -1444,7 +1534,7 @@ type QueryRandomPetRequest struct { func (x *QueryRandomPetRequest) Reset() { *x = QueryRandomPetRequest{} - mi := &file_product_proto_msgTypes[30] + mi := &file_product_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1456,7 +1546,7 @@ func (x *QueryRandomPetRequest) String() string { func (*QueryRandomPetRequest) ProtoMessage() {} func (x *QueryRandomPetRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[30] + mi := &file_product_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1469,7 +1559,7 @@ func (x *QueryRandomPetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomPetRequest.ProtoReflect.Descriptor instead. func (*QueryRandomPetRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{30} + return file_product_proto_rawDescGZIP(), []int{32} } // Response message for randomPet operation. @@ -1482,7 +1572,7 @@ type QueryRandomPetResponse struct { func (x *QueryRandomPetResponse) Reset() { *x = QueryRandomPetResponse{} - mi := &file_product_proto_msgTypes[31] + mi := &file_product_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1494,7 +1584,7 @@ func (x *QueryRandomPetResponse) String() string { func (*QueryRandomPetResponse) ProtoMessage() {} func (x *QueryRandomPetResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[31] + mi := &file_product_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1507,7 +1597,7 @@ func (x *QueryRandomPetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomPetResponse.ProtoReflect.Descriptor instead. func (*QueryRandomPetResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{31} + return file_product_proto_rawDescGZIP(), []int{33} } func (x *QueryRandomPetResponse) GetRandomPet() *Animal { @@ -1526,7 +1616,7 @@ type QueryAllPetsRequest struct { func (x *QueryAllPetsRequest) Reset() { *x = QueryAllPetsRequest{} - mi := &file_product_proto_msgTypes[32] + mi := &file_product_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1538,7 +1628,7 @@ func (x *QueryAllPetsRequest) String() string { func (*QueryAllPetsRequest) ProtoMessage() {} func (x *QueryAllPetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[32] + mi := &file_product_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1551,7 +1641,7 @@ func (x *QueryAllPetsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllPetsRequest.ProtoReflect.Descriptor instead. func (*QueryAllPetsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{32} + return file_product_proto_rawDescGZIP(), []int{34} } // Response message for allPets operation. @@ -1564,7 +1654,7 @@ type QueryAllPetsResponse struct { func (x *QueryAllPetsResponse) Reset() { *x = QueryAllPetsResponse{} - mi := &file_product_proto_msgTypes[33] + mi := &file_product_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1576,7 +1666,7 @@ func (x *QueryAllPetsResponse) String() string { func (*QueryAllPetsResponse) ProtoMessage() {} func (x *QueryAllPetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[33] + mi := &file_product_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1589,7 +1679,7 @@ func (x *QueryAllPetsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllPetsResponse.ProtoReflect.Descriptor instead. func (*QueryAllPetsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{33} + return file_product_proto_rawDescGZIP(), []int{35} } func (x *QueryAllPetsResponse) GetAllPets() []*Animal { @@ -1609,7 +1699,7 @@ type QuerySearchRequest struct { func (x *QuerySearchRequest) Reset() { *x = QuerySearchRequest{} - mi := &file_product_proto_msgTypes[34] + mi := &file_product_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1621,7 +1711,7 @@ func (x *QuerySearchRequest) String() string { func (*QuerySearchRequest) ProtoMessage() {} func (x *QuerySearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[34] + mi := &file_product_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1634,7 +1724,7 @@ func (x *QuerySearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QuerySearchRequest.ProtoReflect.Descriptor instead. func (*QuerySearchRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{34} + return file_product_proto_rawDescGZIP(), []int{36} } func (x *QuerySearchRequest) GetInput() *SearchInput { @@ -1654,7 +1744,7 @@ type QuerySearchResponse struct { func (x *QuerySearchResponse) Reset() { *x = QuerySearchResponse{} - mi := &file_product_proto_msgTypes[35] + mi := &file_product_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1666,7 +1756,7 @@ func (x *QuerySearchResponse) String() string { func (*QuerySearchResponse) ProtoMessage() {} func (x *QuerySearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[35] + mi := &file_product_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1679,7 +1769,7 @@ func (x *QuerySearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QuerySearchResponse.ProtoReflect.Descriptor instead. func (*QuerySearchResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{35} + return file_product_proto_rawDescGZIP(), []int{37} } func (x *QuerySearchResponse) GetSearch() []*SearchResult { @@ -1698,7 +1788,7 @@ type QueryRandomSearchResultRequest struct { func (x *QueryRandomSearchResultRequest) Reset() { *x = QueryRandomSearchResultRequest{} - mi := &file_product_proto_msgTypes[36] + mi := &file_product_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1710,7 +1800,7 @@ func (x *QueryRandomSearchResultRequest) String() string { func (*QueryRandomSearchResultRequest) ProtoMessage() {} func (x *QueryRandomSearchResultRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[36] + mi := &file_product_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1723,7 +1813,7 @@ func (x *QueryRandomSearchResultRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomSearchResultRequest.ProtoReflect.Descriptor instead. func (*QueryRandomSearchResultRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{36} + return file_product_proto_rawDescGZIP(), []int{38} } // Response message for randomSearchResult operation. @@ -1736,7 +1826,7 @@ type QueryRandomSearchResultResponse struct { func (x *QueryRandomSearchResultResponse) Reset() { *x = QueryRandomSearchResultResponse{} - mi := &file_product_proto_msgTypes[37] + mi := &file_product_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1748,7 +1838,7 @@ func (x *QueryRandomSearchResultResponse) String() string { func (*QueryRandomSearchResultResponse) ProtoMessage() {} func (x *QueryRandomSearchResultResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[37] + mi := &file_product_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1761,7 +1851,7 @@ func (x *QueryRandomSearchResultResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomSearchResultResponse.ProtoReflect.Descriptor instead. func (*QueryRandomSearchResultResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{37} + return file_product_proto_rawDescGZIP(), []int{39} } func (x *QueryRandomSearchResultResponse) GetRandomSearchResult() *SearchResult { @@ -1771,186 +1861,6 @@ func (x *QueryRandomSearchResultResponse) GetRandomSearchResult() *SearchResult return nil } -// Request message for createUser operation. -type MutationCreateUserRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Input *UserInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *MutationCreateUserRequest) Reset() { - *x = MutationCreateUserRequest{} - mi := &file_product_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *MutationCreateUserRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MutationCreateUserRequest) ProtoMessage() {} - -func (x *MutationCreateUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[38] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MutationCreateUserRequest.ProtoReflect.Descriptor instead. -func (*MutationCreateUserRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{38} -} - -func (x *MutationCreateUserRequest) GetInput() *UserInput { - if x != nil { - return x.Input - } - return nil -} - -// Response message for createUser operation. -type MutationCreateUserResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - CreateUser *User `protobuf:"bytes,1,opt,name=create_user,json=createUser,proto3" json:"create_user,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *MutationCreateUserResponse) Reset() { - *x = MutationCreateUserResponse{} - mi := &file_product_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *MutationCreateUserResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MutationCreateUserResponse) ProtoMessage() {} - -func (x *MutationCreateUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[39] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MutationCreateUserResponse.ProtoReflect.Descriptor instead. -func (*MutationCreateUserResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{39} -} - -func (x *MutationCreateUserResponse) GetCreateUser() *User { - if x != nil { - return x.CreateUser - } - return nil -} - -// Request message for performAction operation. -type MutationPerformActionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Input *ActionInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *MutationPerformActionRequest) Reset() { - *x = MutationPerformActionRequest{} - mi := &file_product_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *MutationPerformActionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MutationPerformActionRequest) ProtoMessage() {} - -func (x *MutationPerformActionRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[40] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MutationPerformActionRequest.ProtoReflect.Descriptor instead. -func (*MutationPerformActionRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{40} -} - -func (x *MutationPerformActionRequest) GetInput() *ActionInput { - if x != nil { - return x.Input - } - return nil -} - -// Response message for performAction operation. -type MutationPerformActionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - PerformAction *ActionResult `protobuf:"bytes,1,opt,name=perform_action,json=performAction,proto3" json:"perform_action,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *MutationPerformActionResponse) Reset() { - *x = MutationPerformActionResponse{} - mi := &file_product_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *MutationPerformActionResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MutationPerformActionResponse) ProtoMessage() {} - -func (x *MutationPerformActionResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[41] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MutationPerformActionResponse.ProtoReflect.Descriptor instead. -func (*MutationPerformActionResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{41} -} - -func (x *MutationPerformActionResponse) GetPerformAction() *ActionResult { - if x != nil { - return x.PerformAction - } - return nil -} - // Request message for nullableFieldsType operation. type QueryNullableFieldsTypeRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1960,7 +1870,7 @@ type QueryNullableFieldsTypeRequest struct { func (x *QueryNullableFieldsTypeRequest) Reset() { *x = QueryNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[42] + mi := &file_product_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1972,7 +1882,7 @@ func (x *QueryNullableFieldsTypeRequest) String() string { func (*QueryNullableFieldsTypeRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[42] + mi := &file_product_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1985,7 +1895,7 @@ func (x *QueryNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{42} + return file_product_proto_rawDescGZIP(), []int{40} } // Response message for nullableFieldsType operation. @@ -1998,7 +1908,7 @@ type QueryNullableFieldsTypeResponse struct { func (x *QueryNullableFieldsTypeResponse) Reset() { *x = QueryNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[43] + mi := &file_product_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2010,7 +1920,7 @@ func (x *QueryNullableFieldsTypeResponse) String() string { func (*QueryNullableFieldsTypeResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[43] + mi := &file_product_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2023,7 +1933,7 @@ func (x *QueryNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{43} + return file_product_proto_rawDescGZIP(), []int{41} } func (x *QueryNullableFieldsTypeResponse) GetNullableFieldsType() *NullableFieldsType { @@ -2043,7 +1953,7 @@ type QueryNullableFieldsTypeByIdRequest struct { func (x *QueryNullableFieldsTypeByIdRequest) Reset() { *x = QueryNullableFieldsTypeByIdRequest{} - mi := &file_product_proto_msgTypes[44] + mi := &file_product_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2055,7 +1965,7 @@ func (x *QueryNullableFieldsTypeByIdRequest) String() string { func (*QueryNullableFieldsTypeByIdRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[44] + mi := &file_product_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2068,7 +1978,7 @@ func (x *QueryNullableFieldsTypeByIdRequest) ProtoReflect() protoreflect.Message // Deprecated: Use QueryNullableFieldsTypeByIdRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{44} + return file_product_proto_rawDescGZIP(), []int{42} } func (x *QueryNullableFieldsTypeByIdRequest) GetId() string { @@ -2088,7 +1998,7 @@ type QueryNullableFieldsTypeByIdResponse struct { func (x *QueryNullableFieldsTypeByIdResponse) Reset() { *x = QueryNullableFieldsTypeByIdResponse{} - mi := &file_product_proto_msgTypes[45] + mi := &file_product_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2100,7 +2010,7 @@ func (x *QueryNullableFieldsTypeByIdResponse) String() string { func (*QueryNullableFieldsTypeByIdResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[45] + mi := &file_product_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2113,7 +2023,7 @@ func (x *QueryNullableFieldsTypeByIdResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryNullableFieldsTypeByIdResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{45} + return file_product_proto_rawDescGZIP(), []int{43} } func (x *QueryNullableFieldsTypeByIdResponse) GetNullableFieldsTypeById() *NullableFieldsType { @@ -2133,7 +2043,7 @@ type QueryNullableFieldsTypeWithFilterRequest struct { func (x *QueryNullableFieldsTypeWithFilterRequest) Reset() { *x = QueryNullableFieldsTypeWithFilterRequest{} - mi := &file_product_proto_msgTypes[46] + mi := &file_product_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2145,7 +2055,7 @@ func (x *QueryNullableFieldsTypeWithFilterRequest) String() string { func (*QueryNullableFieldsTypeWithFilterRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeWithFilterRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[46] + mi := &file_product_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2158,7 +2068,7 @@ func (x *QueryNullableFieldsTypeWithFilterRequest) ProtoReflect() protoreflect.M // Deprecated: Use QueryNullableFieldsTypeWithFilterRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeWithFilterRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{46} + return file_product_proto_rawDescGZIP(), []int{44} } func (x *QueryNullableFieldsTypeWithFilterRequest) GetFilter() *NullableFieldsFilter { @@ -2178,7 +2088,7 @@ type QueryNullableFieldsTypeWithFilterResponse struct { func (x *QueryNullableFieldsTypeWithFilterResponse) Reset() { *x = QueryNullableFieldsTypeWithFilterResponse{} - mi := &file_product_proto_msgTypes[47] + mi := &file_product_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2190,7 +2100,7 @@ func (x *QueryNullableFieldsTypeWithFilterResponse) String() string { func (*QueryNullableFieldsTypeWithFilterResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeWithFilterResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[47] + mi := &file_product_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2203,7 +2113,7 @@ func (x *QueryNullableFieldsTypeWithFilterResponse) ProtoReflect() protoreflect. // Deprecated: Use QueryNullableFieldsTypeWithFilterResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeWithFilterResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{47} + return file_product_proto_rawDescGZIP(), []int{45} } func (x *QueryNullableFieldsTypeWithFilterResponse) GetNullableFieldsTypeWithFilter() []*NullableFieldsType { @@ -2222,7 +2132,7 @@ type QueryAllNullableFieldsTypesRequest struct { func (x *QueryAllNullableFieldsTypesRequest) Reset() { *x = QueryAllNullableFieldsTypesRequest{} - mi := &file_product_proto_msgTypes[48] + mi := &file_product_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2234,7 +2144,7 @@ func (x *QueryAllNullableFieldsTypesRequest) String() string { func (*QueryAllNullableFieldsTypesRequest) ProtoMessage() {} func (x *QueryAllNullableFieldsTypesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[48] + mi := &file_product_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2247,7 +2157,7 @@ func (x *QueryAllNullableFieldsTypesRequest) ProtoReflect() protoreflect.Message // Deprecated: Use QueryAllNullableFieldsTypesRequest.ProtoReflect.Descriptor instead. func (*QueryAllNullableFieldsTypesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{48} + return file_product_proto_rawDescGZIP(), []int{46} } // Response message for allNullableFieldsTypes operation. @@ -2260,7 +2170,7 @@ type QueryAllNullableFieldsTypesResponse struct { func (x *QueryAllNullableFieldsTypesResponse) Reset() { *x = QueryAllNullableFieldsTypesResponse{} - mi := &file_product_proto_msgTypes[49] + mi := &file_product_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2272,7 +2182,7 @@ func (x *QueryAllNullableFieldsTypesResponse) String() string { func (*QueryAllNullableFieldsTypesResponse) ProtoMessage() {} func (x *QueryAllNullableFieldsTypesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[49] + mi := &file_product_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2285,7 +2195,7 @@ func (x *QueryAllNullableFieldsTypesResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryAllNullableFieldsTypesResponse.ProtoReflect.Descriptor instead. func (*QueryAllNullableFieldsTypesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{49} + return file_product_proto_rawDescGZIP(), []int{47} } func (x *QueryAllNullableFieldsTypesResponse) GetAllNullableFieldsTypes() []*NullableFieldsType { @@ -2295,6 +2205,186 @@ func (x *QueryAllNullableFieldsTypesResponse) GetAllNullableFieldsTypes() []*Nul return nil } +// Request message for createUser operation. +type MutationCreateUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Input *UserInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationCreateUserRequest) Reset() { + *x = MutationCreateUserRequest{} + mi := &file_product_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MutationCreateUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationCreateUserRequest) ProtoMessage() {} + +func (x *MutationCreateUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[48] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MutationCreateUserRequest.ProtoReflect.Descriptor instead. +func (*MutationCreateUserRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{48} +} + +func (x *MutationCreateUserRequest) GetInput() *UserInput { + if x != nil { + return x.Input + } + return nil +} + +// Response message for createUser operation. +type MutationCreateUserResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CreateUser *User `protobuf:"bytes,1,opt,name=create_user,json=createUser,proto3" json:"create_user,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationCreateUserResponse) Reset() { + *x = MutationCreateUserResponse{} + mi := &file_product_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MutationCreateUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationCreateUserResponse) ProtoMessage() {} + +func (x *MutationCreateUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[49] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MutationCreateUserResponse.ProtoReflect.Descriptor instead. +func (*MutationCreateUserResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{49} +} + +func (x *MutationCreateUserResponse) GetCreateUser() *User { + if x != nil { + return x.CreateUser + } + return nil +} + +// Request message for performAction operation. +type MutationPerformActionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Input *ActionInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationPerformActionRequest) Reset() { + *x = MutationPerformActionRequest{} + mi := &file_product_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MutationPerformActionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationPerformActionRequest) ProtoMessage() {} + +func (x *MutationPerformActionRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[50] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MutationPerformActionRequest.ProtoReflect.Descriptor instead. +func (*MutationPerformActionRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{50} +} + +func (x *MutationPerformActionRequest) GetInput() *ActionInput { + if x != nil { + return x.Input + } + return nil +} + +// Response message for performAction operation. +type MutationPerformActionResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + PerformAction *ActionResult `protobuf:"bytes,1,opt,name=perform_action,json=performAction,proto3" json:"perform_action,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationPerformActionResponse) Reset() { + *x = MutationPerformActionResponse{} + mi := &file_product_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MutationPerformActionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationPerformActionResponse) ProtoMessage() {} + +func (x *MutationPerformActionResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[51] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MutationPerformActionResponse.ProtoReflect.Descriptor instead. +func (*MutationPerformActionResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{51} +} + +func (x *MutationPerformActionResponse) GetPerformAction() *ActionResult { + if x != nil { + return x.PerformAction + } + return nil +} + // Request message for createNullableFieldsType operation. type MutationCreateNullableFieldsTypeRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -2305,7 +2395,7 @@ type MutationCreateNullableFieldsTypeRequest struct { func (x *MutationCreateNullableFieldsTypeRequest) Reset() { *x = MutationCreateNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[50] + mi := &file_product_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2317,7 +2407,7 @@ func (x *MutationCreateNullableFieldsTypeRequest) String() string { func (*MutationCreateNullableFieldsTypeRequest) ProtoMessage() {} func (x *MutationCreateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[50] + mi := &file_product_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2330,7 +2420,7 @@ func (x *MutationCreateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Me // Deprecated: Use MutationCreateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. func (*MutationCreateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{50} + return file_product_proto_rawDescGZIP(), []int{52} } func (x *MutationCreateNullableFieldsTypeRequest) GetInput() *NullableFieldsInput { @@ -2350,7 +2440,7 @@ type MutationCreateNullableFieldsTypeResponse struct { func (x *MutationCreateNullableFieldsTypeResponse) Reset() { *x = MutationCreateNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[51] + mi := &file_product_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2362,7 +2452,7 @@ func (x *MutationCreateNullableFieldsTypeResponse) String() string { func (*MutationCreateNullableFieldsTypeResponse) ProtoMessage() {} func (x *MutationCreateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[51] + mi := &file_product_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2375,7 +2465,7 @@ func (x *MutationCreateNullableFieldsTypeResponse) ProtoReflect() protoreflect.M // Deprecated: Use MutationCreateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. func (*MutationCreateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{51} + return file_product_proto_rawDescGZIP(), []int{53} } func (x *MutationCreateNullableFieldsTypeResponse) GetCreateNullableFieldsType() *NullableFieldsType { @@ -2396,7 +2486,7 @@ type MutationUpdateNullableFieldsTypeRequest struct { func (x *MutationUpdateNullableFieldsTypeRequest) Reset() { *x = MutationUpdateNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[52] + mi := &file_product_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2408,7 +2498,7 @@ func (x *MutationUpdateNullableFieldsTypeRequest) String() string { func (*MutationUpdateNullableFieldsTypeRequest) ProtoMessage() {} func (x *MutationUpdateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[52] + mi := &file_product_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2421,7 +2511,7 @@ func (x *MutationUpdateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Me // Deprecated: Use MutationUpdateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. func (*MutationUpdateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{52} + return file_product_proto_rawDescGZIP(), []int{54} } func (x *MutationUpdateNullableFieldsTypeRequest) GetId() string { @@ -2448,7 +2538,7 @@ type MutationUpdateNullableFieldsTypeResponse struct { func (x *MutationUpdateNullableFieldsTypeResponse) Reset() { *x = MutationUpdateNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[53] + mi := &file_product_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2460,7 +2550,7 @@ func (x *MutationUpdateNullableFieldsTypeResponse) String() string { func (*MutationUpdateNullableFieldsTypeResponse) ProtoMessage() {} func (x *MutationUpdateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[53] + mi := &file_product_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2473,7 +2563,7 @@ func (x *MutationUpdateNullableFieldsTypeResponse) ProtoReflect() protoreflect.M // Deprecated: Use MutationUpdateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. func (*MutationUpdateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{53} + return file_product_proto_rawDescGZIP(), []int{55} } func (x *MutationUpdateNullableFieldsTypeResponse) GetUpdateNullableFieldsType() *NullableFieldsType { @@ -2494,7 +2584,7 @@ type Product struct { func (x *Product) Reset() { *x = Product{} - mi := &file_product_proto_msgTypes[54] + mi := &file_product_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2506,7 +2596,7 @@ func (x *Product) String() string { func (*Product) ProtoMessage() {} func (x *Product) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[54] + mi := &file_product_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2519,7 +2609,7 @@ func (x *Product) ProtoReflect() protoreflect.Message { // Deprecated: Use Product.ProtoReflect.Descriptor instead. func (*Product) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{54} + return file_product_proto_rawDescGZIP(), []int{56} } func (x *Product) GetId() string { @@ -2554,7 +2644,7 @@ type Storage struct { func (x *Storage) Reset() { *x = Storage{} - mi := &file_product_proto_msgTypes[55] + mi := &file_product_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2566,7 +2656,7 @@ func (x *Storage) String() string { func (*Storage) ProtoMessage() {} func (x *Storage) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[55] + mi := &file_product_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2579,7 +2669,7 @@ func (x *Storage) ProtoReflect() protoreflect.Message { // Deprecated: Use Storage.ProtoReflect.Descriptor instead. func (*Storage) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{55} + return file_product_proto_rawDescGZIP(), []int{57} } func (x *Storage) GetId() string { @@ -2613,7 +2703,7 @@ type User struct { func (x *User) Reset() { *x = User{} - mi := &file_product_proto_msgTypes[56] + mi := &file_product_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2625,7 +2715,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[56] + mi := &file_product_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2638,7 +2728,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{56} + return file_product_proto_rawDescGZIP(), []int{58} } func (x *User) GetId() string { @@ -2666,7 +2756,7 @@ type NestedTypeA struct { func (x *NestedTypeA) Reset() { *x = NestedTypeA{} - mi := &file_product_proto_msgTypes[57] + mi := &file_product_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2678,7 +2768,7 @@ func (x *NestedTypeA) String() string { func (*NestedTypeA) ProtoMessage() {} func (x *NestedTypeA) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[57] + mi := &file_product_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2691,7 +2781,7 @@ func (x *NestedTypeA) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeA.ProtoReflect.Descriptor instead. func (*NestedTypeA) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{57} + return file_product_proto_rawDescGZIP(), []int{59} } func (x *NestedTypeA) GetId() string { @@ -2726,7 +2816,7 @@ type RecursiveType struct { func (x *RecursiveType) Reset() { *x = RecursiveType{} - mi := &file_product_proto_msgTypes[58] + mi := &file_product_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2738,7 +2828,7 @@ func (x *RecursiveType) String() string { func (*RecursiveType) ProtoMessage() {} func (x *RecursiveType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[58] + mi := &file_product_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2751,7 +2841,7 @@ func (x *RecursiveType) ProtoReflect() protoreflect.Message { // Deprecated: Use RecursiveType.ProtoReflect.Descriptor instead. func (*RecursiveType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{58} + return file_product_proto_rawDescGZIP(), []int{60} } func (x *RecursiveType) GetId() string { @@ -2787,7 +2877,7 @@ type TypeWithMultipleFilterFields struct { func (x *TypeWithMultipleFilterFields) Reset() { *x = TypeWithMultipleFilterFields{} - mi := &file_product_proto_msgTypes[59] + mi := &file_product_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2799,7 +2889,7 @@ func (x *TypeWithMultipleFilterFields) String() string { func (*TypeWithMultipleFilterFields) ProtoMessage() {} func (x *TypeWithMultipleFilterFields) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[59] + mi := &file_product_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2812,7 +2902,7 @@ func (x *TypeWithMultipleFilterFields) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeWithMultipleFilterFields.ProtoReflect.Descriptor instead. func (*TypeWithMultipleFilterFields) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{59} + return file_product_proto_rawDescGZIP(), []int{61} } func (x *TypeWithMultipleFilterFields) GetId() string { @@ -2853,7 +2943,7 @@ type FilterTypeInput struct { func (x *FilterTypeInput) Reset() { *x = FilterTypeInput{} - mi := &file_product_proto_msgTypes[60] + mi := &file_product_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2865,7 +2955,7 @@ func (x *FilterTypeInput) String() string { func (*FilterTypeInput) ProtoMessage() {} func (x *FilterTypeInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[60] + mi := &file_product_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2878,7 +2968,7 @@ func (x *FilterTypeInput) ProtoReflect() protoreflect.Message { // Deprecated: Use FilterTypeInput.ProtoReflect.Descriptor instead. func (*FilterTypeInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{60} + return file_product_proto_rawDescGZIP(), []int{62} } func (x *FilterTypeInput) GetFilterField_1() string { @@ -2904,7 +2994,7 @@ type ComplexFilterTypeInput struct { func (x *ComplexFilterTypeInput) Reset() { *x = ComplexFilterTypeInput{} - mi := &file_product_proto_msgTypes[61] + mi := &file_product_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2916,7 +3006,7 @@ func (x *ComplexFilterTypeInput) String() string { func (*ComplexFilterTypeInput) ProtoMessage() {} func (x *ComplexFilterTypeInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[61] + mi := &file_product_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2929,7 +3019,7 @@ func (x *ComplexFilterTypeInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ComplexFilterTypeInput.ProtoReflect.Descriptor instead. func (*ComplexFilterTypeInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{61} + return file_product_proto_rawDescGZIP(), []int{63} } func (x *ComplexFilterTypeInput) GetFilter() *FilterType { @@ -2949,7 +3039,7 @@ type TypeWithComplexFilterInput struct { func (x *TypeWithComplexFilterInput) Reset() { *x = TypeWithComplexFilterInput{} - mi := &file_product_proto_msgTypes[62] + mi := &file_product_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2961,7 +3051,7 @@ func (x *TypeWithComplexFilterInput) String() string { func (*TypeWithComplexFilterInput) ProtoMessage() {} func (x *TypeWithComplexFilterInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[62] + mi := &file_product_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2974,7 +3064,7 @@ func (x *TypeWithComplexFilterInput) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeWithComplexFilterInput.ProtoReflect.Descriptor instead. func (*TypeWithComplexFilterInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{62} + return file_product_proto_rawDescGZIP(), []int{64} } func (x *TypeWithComplexFilterInput) GetId() string { @@ -3002,7 +3092,7 @@ type OrderInput struct { func (x *OrderInput) Reset() { *x = OrderInput{} - mi := &file_product_proto_msgTypes[63] + mi := &file_product_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3014,7 +3104,7 @@ func (x *OrderInput) String() string { func (*OrderInput) ProtoMessage() {} func (x *OrderInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[63] + mi := &file_product_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3027,7 +3117,7 @@ func (x *OrderInput) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderInput.ProtoReflect.Descriptor instead. func (*OrderInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{63} + return file_product_proto_rawDescGZIP(), []int{65} } func (x *OrderInput) GetOrderId() string { @@ -3056,14 +3146,14 @@ type Order struct { OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"` CustomerName string `protobuf:"bytes,2,opt,name=customer_name,json=customerName,proto3" json:"customer_name,omitempty"` TotalItems int32 `protobuf:"varint,3,opt,name=total_items,json=totalItems,proto3" json:"total_items,omitempty"` - OrderLines []*OrderLine `protobuf:"bytes,4,rep,name=order_lines,json=orderLines,proto3" json:"order_lines,omitempty"` + OrderLines *ListOfOrderLine `protobuf:"bytes,4,opt,name=order_lines,json=orderLines,proto3" json:"order_lines,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Order) Reset() { *x = Order{} - mi := &file_product_proto_msgTypes[64] + mi := &file_product_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3075,7 +3165,7 @@ func (x *Order) String() string { func (*Order) ProtoMessage() {} func (x *Order) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[64] + mi := &file_product_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3088,7 +3178,7 @@ func (x *Order) ProtoReflect() protoreflect.Message { // Deprecated: Use Order.ProtoReflect.Descriptor instead. func (*Order) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{64} + return file_product_proto_rawDescGZIP(), []int{66} } func (x *Order) GetOrderId() string { @@ -3112,7 +3202,7 @@ func (x *Order) GetTotalItems() int32 { return 0 } -func (x *Order) GetOrderLines() []*OrderLine { +func (x *Order) GetOrderLines() *ListOfOrderLine { if x != nil { return x.OrderLines } @@ -3130,7 +3220,7 @@ type Category struct { func (x *Category) Reset() { *x = Category{} - mi := &file_product_proto_msgTypes[65] + mi := &file_product_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3142,7 +3232,7 @@ func (x *Category) String() string { func (*Category) ProtoMessage() {} func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[65] + mi := &file_product_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3155,7 +3245,7 @@ func (x *Category) ProtoReflect() protoreflect.Message { // Deprecated: Use Category.ProtoReflect.Descriptor instead. func (*Category) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{65} + return file_product_proto_rawDescGZIP(), []int{67} } func (x *Category) GetId() string { @@ -3189,7 +3279,7 @@ type CategoryFilter struct { func (x *CategoryFilter) Reset() { *x = CategoryFilter{} - mi := &file_product_proto_msgTypes[66] + mi := &file_product_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3201,7 +3291,7 @@ func (x *CategoryFilter) String() string { func (*CategoryFilter) ProtoMessage() {} func (x *CategoryFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[66] + mi := &file_product_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3214,7 +3304,7 @@ func (x *CategoryFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use CategoryFilter.ProtoReflect.Descriptor instead. func (*CategoryFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{66} + return file_product_proto_rawDescGZIP(), []int{68} } func (x *CategoryFilter) GetCategory() CategoryKind { @@ -3244,7 +3334,7 @@ type Animal struct { func (x *Animal) Reset() { *x = Animal{} - mi := &file_product_proto_msgTypes[67] + mi := &file_product_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3256,7 +3346,7 @@ func (x *Animal) String() string { func (*Animal) ProtoMessage() {} func (x *Animal) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[67] + mi := &file_product_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3269,7 +3359,7 @@ func (x *Animal) ProtoReflect() protoreflect.Message { // Deprecated: Use Animal.ProtoReflect.Descriptor instead. func (*Animal) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{67} + return file_product_proto_rawDescGZIP(), []int{69} } func (x *Animal) GetInstance() isAnimal_Instance { @@ -3316,14 +3406,14 @@ func (*Animal_Dog) isAnimal_Instance() {} type SearchInput struct { state protoimpl.MessageState `protogen:"open.v1"` Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` - Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Limit *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *SearchInput) Reset() { *x = SearchInput{} - mi := &file_product_proto_msgTypes[68] + mi := &file_product_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3335,7 +3425,7 @@ func (x *SearchInput) String() string { func (*SearchInput) ProtoMessage() {} func (x *SearchInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[68] + mi := &file_product_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3348,7 +3438,7 @@ func (x *SearchInput) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchInput.ProtoReflect.Descriptor instead. func (*SearchInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{68} + return file_product_proto_rawDescGZIP(), []int{70} } func (x *SearchInput) GetQuery() string { @@ -3358,11 +3448,11 @@ func (x *SearchInput) GetQuery() string { return "" } -func (x *SearchInput) GetLimit() int32 { +func (x *SearchInput) GetLimit() *wrapperspb.Int32Value { if x != nil { return x.Limit } - return 0 + return nil } type SearchResult struct { @@ -3379,7 +3469,7 @@ type SearchResult struct { func (x *SearchResult) Reset() { *x = SearchResult{} - mi := &file_product_proto_msgTypes[69] + mi := &file_product_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3391,7 +3481,7 @@ func (x *SearchResult) String() string { func (*SearchResult) ProtoMessage() {} func (x *SearchResult) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[69] + mi := &file_product_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3404,7 +3494,7 @@ func (x *SearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResult.ProtoReflect.Descriptor instead. func (*SearchResult) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{69} + return file_product_proto_rawDescGZIP(), []int{71} } func (x *SearchResult) GetValue() isSearchResult_Value { @@ -3463,6 +3553,166 @@ func (*SearchResult_User) isSearchResult_Value() {} func (*SearchResult_Category) isSearchResult_Value() {} +type NullableFieldsType struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + OptionalString *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` + OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,4,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` + OptionalFloat *wrapperspb.DoubleValue `protobuf:"bytes,5,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` + OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` + RequiredString string `protobuf:"bytes,7,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` + RequiredInt int32 `protobuf:"varint,8,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NullableFieldsType) Reset() { + *x = NullableFieldsType{} + mi := &file_product_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NullableFieldsType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NullableFieldsType) ProtoMessage() {} + +func (x *NullableFieldsType) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[72] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NullableFieldsType.ProtoReflect.Descriptor instead. +func (*NullableFieldsType) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{72} +} + +func (x *NullableFieldsType) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *NullableFieldsType) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NullableFieldsType) GetOptionalString() *wrapperspb.StringValue { + if x != nil { + return x.OptionalString + } + return nil +} + +func (x *NullableFieldsType) GetOptionalInt() *wrapperspb.Int32Value { + if x != nil { + return x.OptionalInt + } + return nil +} + +func (x *NullableFieldsType) GetOptionalFloat() *wrapperspb.DoubleValue { + if x != nil { + return x.OptionalFloat + } + return nil +} + +func (x *NullableFieldsType) GetOptionalBoolean() *wrapperspb.BoolValue { + if x != nil { + return x.OptionalBoolean + } + return nil +} + +func (x *NullableFieldsType) GetRequiredString() string { + if x != nil { + return x.RequiredString + } + return "" +} + +func (x *NullableFieldsType) GetRequiredInt() int32 { + if x != nil { + return x.RequiredInt + } + return 0 +} + +type NullableFieldsFilter struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` + IncludeNulls *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=include_nulls,json=includeNulls,proto3" json:"include_nulls,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NullableFieldsFilter) Reset() { + *x = NullableFieldsFilter{} + mi := &file_product_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NullableFieldsFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NullableFieldsFilter) ProtoMessage() {} + +func (x *NullableFieldsFilter) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[73] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NullableFieldsFilter.ProtoReflect.Descriptor instead. +func (*NullableFieldsFilter) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{73} +} + +func (x *NullableFieldsFilter) GetName() *wrapperspb.StringValue { + if x != nil { + return x.Name + } + return nil +} + +func (x *NullableFieldsFilter) GetOptionalString() *wrapperspb.StringValue { + if x != nil { + return x.OptionalString + } + return nil +} + +func (x *NullableFieldsFilter) GetIncludeNulls() *wrapperspb.BoolValue { + if x != nil { + return x.IncludeNulls + } + return nil +} + type UserInput struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -3472,7 +3722,7 @@ type UserInput struct { func (x *UserInput) Reset() { *x = UserInput{} - mi := &file_product_proto_msgTypes[70] + mi := &file_product_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3484,7 +3734,7 @@ func (x *UserInput) String() string { func (*UserInput) ProtoMessage() {} func (x *UserInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[70] + mi := &file_product_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3497,7 +3747,7 @@ func (x *UserInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UserInput.ProtoReflect.Descriptor instead. func (*UserInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{70} + return file_product_proto_rawDescGZIP(), []int{74} } func (x *UserInput) GetName() string { @@ -3517,7 +3767,7 @@ type ActionInput struct { func (x *ActionInput) Reset() { *x = ActionInput{} - mi := &file_product_proto_msgTypes[71] + mi := &file_product_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3529,7 +3779,7 @@ func (x *ActionInput) String() string { func (*ActionInput) ProtoMessage() {} func (x *ActionInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[71] + mi := &file_product_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3542,7 +3792,7 @@ func (x *ActionInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionInput.ProtoReflect.Descriptor instead. func (*ActionInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{71} + return file_product_proto_rawDescGZIP(), []int{75} } func (x *ActionInput) GetType() string { @@ -3572,7 +3822,7 @@ type ActionResult struct { func (x *ActionResult) Reset() { *x = ActionResult{} - mi := &file_product_proto_msgTypes[72] + mi := &file_product_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3584,7 +3834,7 @@ func (x *ActionResult) String() string { func (*ActionResult) ProtoMessage() {} func (x *ActionResult) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[72] + mi := &file_product_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3597,7 +3847,7 @@ func (x *ActionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionResult.ProtoReflect.Descriptor instead. func (*ActionResult) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{72} + return file_product_proto_rawDescGZIP(), []int{76} } func (x *ActionResult) GetValue() isActionResult_Value { @@ -3641,30 +3891,122 @@ func (*ActionResult_ActionSuccess) isActionResult_Value() {} func (*ActionResult_ActionError) isActionResult_Value() {} -type NestedTypeB struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - C *NestedTypeC `protobuf:"bytes,3,opt,name=c,proto3" json:"c,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type NullableFieldsInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` + OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` + OptionalFloat *wrapperspb.DoubleValue `protobuf:"bytes,4,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` + OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,5,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` + RequiredString string `protobuf:"bytes,6,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` + RequiredInt int32 `protobuf:"varint,7,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *NestedTypeB) Reset() { - *x = NestedTypeB{} - mi := &file_product_proto_msgTypes[73] +func (x *NullableFieldsInput) Reset() { + *x = NullableFieldsInput{} + mi := &file_product_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *NestedTypeB) String() string { +func (x *NullableFieldsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NullableFieldsInput) ProtoMessage() {} + +func (x *NullableFieldsInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[77] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NullableFieldsInput.ProtoReflect.Descriptor instead. +func (*NullableFieldsInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{77} +} + +func (x *NullableFieldsInput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NullableFieldsInput) GetOptionalString() *wrapperspb.StringValue { + if x != nil { + return x.OptionalString + } + return nil +} + +func (x *NullableFieldsInput) GetOptionalInt() *wrapperspb.Int32Value { + if x != nil { + return x.OptionalInt + } + return nil +} + +func (x *NullableFieldsInput) GetOptionalFloat() *wrapperspb.DoubleValue { + if x != nil { + return x.OptionalFloat + } + return nil +} + +func (x *NullableFieldsInput) GetOptionalBoolean() *wrapperspb.BoolValue { + if x != nil { + return x.OptionalBoolean + } + return nil +} + +func (x *NullableFieldsInput) GetRequiredString() string { + if x != nil { + return x.RequiredString + } + return "" +} + +func (x *NullableFieldsInput) GetRequiredInt() int32 { + if x != nil { + return x.RequiredInt + } + return 0 +} + +type NestedTypeB struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + C *NestedTypeC `protobuf:"bytes,3,opt,name=c,proto3" json:"c,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NestedTypeB) Reset() { + *x = NestedTypeB{} + mi := &file_product_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NestedTypeB) String() string { return protoimpl.X.MessageStringOf(x) } func (*NestedTypeB) ProtoMessage() {} func (x *NestedTypeB) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[73] + mi := &file_product_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3677,7 +4019,7 @@ func (x *NestedTypeB) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeB.ProtoReflect.Descriptor instead. func (*NestedTypeB) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{73} + return file_product_proto_rawDescGZIP(), []int{78} } func (x *NestedTypeB) GetId() string { @@ -3711,7 +4053,7 @@ type NestedTypeC struct { func (x *NestedTypeC) Reset() { *x = NestedTypeC{} - mi := &file_product_proto_msgTypes[74] + mi := &file_product_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3723,7 +4065,7 @@ func (x *NestedTypeC) String() string { func (*NestedTypeC) ProtoMessage() {} func (x *NestedTypeC) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[74] + mi := &file_product_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3736,7 +4078,7 @@ func (x *NestedTypeC) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeC.ProtoReflect.Descriptor instead. func (*NestedTypeC) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{74} + return file_product_proto_rawDescGZIP(), []int{79} } func (x *NestedTypeC) GetId() string { @@ -3765,7 +4107,7 @@ type FilterType struct { func (x *FilterType) Reset() { *x = FilterType{} - mi := &file_product_proto_msgTypes[75] + mi := &file_product_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3777,7 +4119,7 @@ func (x *FilterType) String() string { func (*FilterType) ProtoMessage() {} func (x *FilterType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[75] + mi := &file_product_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3790,7 +4132,7 @@ func (x *FilterType) ProtoReflect() protoreflect.Message { // Deprecated: Use FilterType.ProtoReflect.Descriptor instead. func (*FilterType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{75} + return file_product_proto_rawDescGZIP(), []int{80} } func (x *FilterType) GetName() string { @@ -3831,7 +4173,7 @@ type Pagination struct { func (x *Pagination) Reset() { *x = Pagination{} - mi := &file_product_proto_msgTypes[76] + mi := &file_product_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3843,7 +4185,7 @@ func (x *Pagination) String() string { func (*Pagination) ProtoMessage() {} func (x *Pagination) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[76] + mi := &file_product_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3856,7 +4198,7 @@ func (x *Pagination) ProtoReflect() protoreflect.Message { // Deprecated: Use Pagination.ProtoReflect.Descriptor instead. func (*Pagination) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{76} + return file_product_proto_rawDescGZIP(), []int{81} } func (x *Pagination) GetPage() int32 { @@ -3877,14 +4219,14 @@ type OrderLineInput struct { state protoimpl.MessageState `protogen:"open.v1"` ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` Quantity int32 `protobuf:"varint,2,opt,name=quantity,proto3" json:"quantity,omitempty"` - Modifiers []string `protobuf:"bytes,3,rep,name=modifiers,proto3" json:"modifiers,omitempty"` + Modifiers *ListOfString `protobuf:"bytes,3,opt,name=modifiers,proto3" json:"modifiers,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *OrderLineInput) Reset() { *x = OrderLineInput{} - mi := &file_product_proto_msgTypes[77] + mi := &file_product_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3896,7 +4238,7 @@ func (x *OrderLineInput) String() string { func (*OrderLineInput) ProtoMessage() {} func (x *OrderLineInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[77] + mi := &file_product_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3909,7 +4251,7 @@ func (x *OrderLineInput) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderLineInput.ProtoReflect.Descriptor instead. func (*OrderLineInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{77} + return file_product_proto_rawDescGZIP(), []int{82} } func (x *OrderLineInput) GetProductId() string { @@ -3926,7 +4268,7 @@ func (x *OrderLineInput) GetQuantity() int32 { return 0 } -func (x *OrderLineInput) GetModifiers() []string { +func (x *OrderLineInput) GetModifiers() *ListOfString { if x != nil { return x.Modifiers } @@ -3937,14 +4279,14 @@ type OrderLine struct { state protoimpl.MessageState `protogen:"open.v1"` ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` Quantity int32 `protobuf:"varint,2,opt,name=quantity,proto3" json:"quantity,omitempty"` - Modifiers []string `protobuf:"bytes,3,rep,name=modifiers,proto3" json:"modifiers,omitempty"` + Modifiers *ListOfString `protobuf:"bytes,3,opt,name=modifiers,proto3" json:"modifiers,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *OrderLine) Reset() { *x = OrderLine{} - mi := &file_product_proto_msgTypes[78] + mi := &file_product_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3956,7 +4298,7 @@ func (x *OrderLine) String() string { func (*OrderLine) ProtoMessage() {} func (x *OrderLine) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[78] + mi := &file_product_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3969,7 +4311,7 @@ func (x *OrderLine) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderLine.ProtoReflect.Descriptor instead. func (*OrderLine) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{78} + return file_product_proto_rawDescGZIP(), []int{83} } func (x *OrderLine) GetProductId() string { @@ -3986,7 +4328,7 @@ func (x *OrderLine) GetQuantity() int32 { return 0 } -func (x *OrderLine) GetModifiers() []string { +func (x *OrderLine) GetModifiers() *ListOfString { if x != nil { return x.Modifiers } @@ -4005,7 +4347,7 @@ type Cat struct { func (x *Cat) Reset() { *x = Cat{} - mi := &file_product_proto_msgTypes[79] + mi := &file_product_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4017,7 +4359,7 @@ func (x *Cat) String() string { func (*Cat) ProtoMessage() {} func (x *Cat) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[79] + mi := &file_product_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4030,7 +4372,7 @@ func (x *Cat) ProtoReflect() protoreflect.Message { // Deprecated: Use Cat.ProtoReflect.Descriptor instead. func (*Cat) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{79} + return file_product_proto_rawDescGZIP(), []int{84} } func (x *Cat) GetId() string { @@ -4073,7 +4415,7 @@ type Dog struct { func (x *Dog) Reset() { *x = Dog{} - mi := &file_product_proto_msgTypes[80] + mi := &file_product_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4085,7 +4427,7 @@ func (x *Dog) String() string { func (*Dog) ProtoMessage() {} func (x *Dog) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[80] + mi := &file_product_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4098,7 +4440,7 @@ func (x *Dog) ProtoReflect() protoreflect.Message { // Deprecated: Use Dog.ProtoReflect.Descriptor instead. func (*Dog) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{80} + return file_product_proto_rawDescGZIP(), []int{85} } func (x *Dog) GetId() string { @@ -4139,7 +4481,7 @@ type ActionSuccess struct { func (x *ActionSuccess) Reset() { *x = ActionSuccess{} - mi := &file_product_proto_msgTypes[81] + mi := &file_product_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4151,7 +4493,7 @@ func (x *ActionSuccess) String() string { func (*ActionSuccess) ProtoMessage() {} func (x *ActionSuccess) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[81] + mi := &file_product_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4164,7 +4506,7 @@ func (x *ActionSuccess) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionSuccess.ProtoReflect.Descriptor instead. func (*ActionSuccess) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{81} + return file_product_proto_rawDescGZIP(), []int{86} } func (x *ActionSuccess) GetMessage() string { @@ -4191,7 +4533,7 @@ type ActionError struct { func (x *ActionError) Reset() { *x = ActionError{} - mi := &file_product_proto_msgTypes[82] + mi := &file_product_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4203,7 +4545,7 @@ func (x *ActionError) String() string { func (*ActionError) ProtoMessage() {} func (x *ActionError) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[82] + mi := &file_product_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4216,7 +4558,7 @@ func (x *ActionError) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionError.ProtoReflect.Descriptor instead. func (*ActionError) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{82} + return file_product_proto_rawDescGZIP(), []int{87} } func (x *ActionError) GetMessage() string { @@ -4233,264 +4575,15 @@ func (x *ActionError) GetCode() string { return "" } -// New messages for testing nullable fields -type NullableFieldsType struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - OptionalString *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` - OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,4,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` - OptionalFloat *wrapperspb.FloatValue `protobuf:"bytes,5,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` - OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` - RequiredString string `protobuf:"bytes,7,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` - RequiredInt int32 `protobuf:"varint,8,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *NullableFieldsType) Reset() { - *x = NullableFieldsType{} - mi := &file_product_proto_msgTypes[83] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *NullableFieldsType) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NullableFieldsType) ProtoMessage() {} - -func (x *NullableFieldsType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[83] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NullableFieldsType.ProtoReflect.Descriptor instead. -func (*NullableFieldsType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{83} -} - -func (x *NullableFieldsType) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *NullableFieldsType) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *NullableFieldsType) GetOptionalString() *wrapperspb.StringValue { - if x != nil { - return x.OptionalString - } - return nil -} - -func (x *NullableFieldsType) GetOptionalInt() *wrapperspb.Int32Value { - if x != nil { - return x.OptionalInt - } - return nil -} - -func (x *NullableFieldsType) GetOptionalFloat() *wrapperspb.FloatValue { - if x != nil { - return x.OptionalFloat - } - return nil -} - -func (x *NullableFieldsType) GetOptionalBoolean() *wrapperspb.BoolValue { - if x != nil { - return x.OptionalBoolean - } - return nil -} - -func (x *NullableFieldsType) GetRequiredString() string { - if x != nil { - return x.RequiredString - } - return "" -} - -func (x *NullableFieldsType) GetRequiredInt() int32 { - if x != nil { - return x.RequiredInt - } - return 0 -} - -type NullableFieldsInput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` - OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` - OptionalFloat *wrapperspb.FloatValue `protobuf:"bytes,4,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` - OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,5,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` - RequiredString string `protobuf:"bytes,6,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` - RequiredInt int32 `protobuf:"varint,7,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *NullableFieldsInput) Reset() { - *x = NullableFieldsInput{} - mi := &file_product_proto_msgTypes[84] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *NullableFieldsInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NullableFieldsInput) ProtoMessage() {} - -func (x *NullableFieldsInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[84] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NullableFieldsInput.ProtoReflect.Descriptor instead. -func (*NullableFieldsInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{84} -} - -func (x *NullableFieldsInput) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *NullableFieldsInput) GetOptionalString() *wrapperspb.StringValue { - if x != nil { - return x.OptionalString - } - return nil -} - -func (x *NullableFieldsInput) GetOptionalInt() *wrapperspb.Int32Value { - if x != nil { - return x.OptionalInt - } - return nil -} - -func (x *NullableFieldsInput) GetOptionalFloat() *wrapperspb.FloatValue { - if x != nil { - return x.OptionalFloat - } - return nil -} - -func (x *NullableFieldsInput) GetOptionalBoolean() *wrapperspb.BoolValue { - if x != nil { - return x.OptionalBoolean - } - return nil -} - -func (x *NullableFieldsInput) GetRequiredString() string { - if x != nil { - return x.RequiredString - } - return "" -} - -func (x *NullableFieldsInput) GetRequiredInt() int32 { - if x != nil { - return x.RequiredInt - } - return 0 -} - -type NullableFieldsFilter struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` - IncludeNulls *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=include_nulls,json=includeNulls,proto3" json:"include_nulls,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *NullableFieldsFilter) Reset() { - *x = NullableFieldsFilter{} - mi := &file_product_proto_msgTypes[85] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *NullableFieldsFilter) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NullableFieldsFilter) ProtoMessage() {} - -func (x *NullableFieldsFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[85] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NullableFieldsFilter.ProtoReflect.Descriptor instead. -func (*NullableFieldsFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{85} -} - -func (x *NullableFieldsFilter) GetName() *wrapperspb.StringValue { - if x != nil { - return x.Name - } - return nil -} - -func (x *NullableFieldsFilter) GetOptionalString() *wrapperspb.StringValue { - if x != nil { - return x.OptionalString - } - return nil -} - -func (x *NullableFieldsFilter) GetIncludeNulls() *wrapperspb.BoolValue { - if x != nil { - return x.IncludeNulls - } - return nil -} - var File_product_proto protoreflect.FileDescriptor const file_product_proto_rawDesc = "" + "\n" + - "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\"-\n" + + "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\"=\n" + + "\x0fListOfOrderLine\x12*\n" + + "\x05items\x18\x01 \x03(\v2\x14.productv1.OrderLineR\x05items\"$\n" + + "\fListOfString\x12\x14\n" + + "\x05items\x18\x01 \x03(\tR\x05items\"-\n" + "\x1bLookupProductByIdRequestKey\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\"V\n" + "\x18LookupProductByIdRequest\x12:\n" + @@ -4564,16 +4657,7 @@ const file_product_proto_rawDesc = "" + "\x06search\x18\x01 \x03(\v2\x17.productv1.SearchResultR\x06search\" \n" + "\x1eQueryRandomSearchResultRequest\"l\n" + "\x1fQueryRandomSearchResultResponse\x12I\n" + - "\x14random_search_result\x18\x01 \x01(\v2\x17.productv1.SearchResultR\x12randomSearchResult\"G\n" + - "\x19MutationCreateUserRequest\x12*\n" + - "\x05input\x18\x01 \x01(\v2\x14.productv1.UserInputR\x05input\"N\n" + - "\x1aMutationCreateUserResponse\x120\n" + - "\vcreate_user\x18\x01 \x01(\v2\x0f.productv1.UserR\n" + - "createUser\"L\n" + - "\x1cMutationPerformActionRequest\x12,\n" + - "\x05input\x18\x01 \x01(\v2\x16.productv1.ActionInputR\x05input\"_\n" + - "\x1dMutationPerformActionResponse\x12>\n" + - "\x0eperform_action\x18\x01 \x01(\v2\x17.productv1.ActionResultR\rperformAction\" \n" + + "\x14random_search_result\x18\x01 \x01(\v2\x17.productv1.SearchResultR\x12randomSearchResult\" \n" + "\x1eQueryNullableFieldsTypeRequest\"r\n" + "\x1fQueryNullableFieldsTypeResponse\x12O\n" + "\x14nullable_fields_type\x18\x01 \x01(\v2\x1d.productv1.NullableFieldsTypeR\x12nullableFieldsType\"4\n" + @@ -4587,7 +4671,16 @@ const file_product_proto_rawDesc = "" + " nullable_fields_type_with_filter\x18\x01 \x03(\v2\x1d.productv1.NullableFieldsTypeR\x1cnullableFieldsTypeWithFilter\"$\n" + "\"QueryAllNullableFieldsTypesRequest\"\x7f\n" + "#QueryAllNullableFieldsTypesResponse\x12X\n" + - "\x19all_nullable_fields_types\x18\x01 \x03(\v2\x1d.productv1.NullableFieldsTypeR\x16allNullableFieldsTypes\"_\n" + + "\x19all_nullable_fields_types\x18\x01 \x03(\v2\x1d.productv1.NullableFieldsTypeR\x16allNullableFieldsTypes\"G\n" + + "\x19MutationCreateUserRequest\x12*\n" + + "\x05input\x18\x01 \x01(\v2\x14.productv1.UserInputR\x05input\"N\n" + + "\x1aMutationCreateUserResponse\x120\n" + + "\vcreate_user\x18\x01 \x01(\v2\x0f.productv1.UserR\n" + + "createUser\"L\n" + + "\x1cMutationPerformActionRequest\x12,\n" + + "\x05input\x18\x01 \x01(\v2\x16.productv1.ActionInputR\x05input\"_\n" + + "\x1dMutationPerformActionResponse\x12>\n" + + "\x0eperform_action\x18\x01 \x01(\v2\x17.productv1.ActionResultR\rperformAction\"_\n" + "'MutationCreateNullableFieldsTypeRequest\x124\n" + "\x05input\x18\x01 \x01(\v2\x1e.productv1.NullableFieldsInputR\x05input\"\x88\x01\n" + "(MutationCreateNullableFieldsTypeResponse\x12\\\n" + @@ -4633,13 +4726,13 @@ const file_product_proto_rawDesc = "" + "OrderInput\x12\x19\n" + "\border_id\x18\x01 \x01(\tR\aorderId\x12#\n" + "\rcustomer_name\x18\x02 \x01(\tR\fcustomerName\x12/\n" + - "\x05lines\x18\x03 \x03(\v2\x19.productv1.OrderLineInputR\x05lines\"\x9f\x01\n" + + "\x05lines\x18\x03 \x03(\v2\x19.productv1.OrderLineInputR\x05lines\"\xa5\x01\n" + "\x05Order\x12\x19\n" + "\border_id\x18\x01 \x01(\tR\aorderId\x12#\n" + "\rcustomer_name\x18\x02 \x01(\tR\fcustomerName\x12\x1f\n" + "\vtotal_items\x18\x03 \x01(\x05R\n" + - "totalItems\x125\n" + - "\vorder_lines\x18\x04 \x03(\v2\x14.productv1.OrderLineR\n" + + "totalItems\x12;\n" + + "\vorder_lines\x18\x04 \x01(\v2\x1a.productv1.ListOfOrderLineR\n" + "orderLines\"[\n" + "\bCategory\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + @@ -4654,15 +4747,28 @@ const file_product_proto_rawDesc = "" + "\x03cat\x18\x01 \x01(\v2\x0e.productv1.CatH\x00R\x03cat\x12\"\n" + "\x03dog\x18\x02 \x01(\v2\x0e.productv1.DogH\x00R\x03dogB\n" + "\n" + - "\binstance\"9\n" + + "\binstance\"V\n" + "\vSearchInput\x12\x14\n" + - "\x05query\x18\x01 \x01(\tR\x05query\x12\x14\n" + - "\x05limit\x18\x02 \x01(\x05R\x05limit\"\xa1\x01\n" + + "\x05query\x18\x01 \x01(\tR\x05query\x121\n" + + "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\"\xa1\x01\n" + "\fSearchResult\x12.\n" + "\aproduct\x18\x01 \x01(\v2\x12.productv1.ProductH\x00R\aproduct\x12%\n" + "\x04user\x18\x02 \x01(\v2\x0f.productv1.UserH\x00R\x04user\x121\n" + "\bcategory\x18\x03 \x01(\v2\x13.productv1.CategoryH\x00R\bcategoryB\a\n" + - "\x05value\"\x1f\n" + + "\x05value\"\x97\x03\n" + + "\x12NullableFieldsType\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12E\n" + + "\x0foptional_string\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12>\n" + + "\foptional_int\x18\x04 \x01(\v2\x1b.google.protobuf.Int32ValueR\voptionalInt\x12C\n" + + "\x0eoptional_float\x18\x05 \x01(\v2\x1c.google.protobuf.DoubleValueR\roptionalFloat\x12E\n" + + "\x10optional_boolean\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x0foptionalBoolean\x12'\n" + + "\x0frequired_string\x18\a \x01(\tR\x0erequiredString\x12!\n" + + "\frequired_int\x18\b \x01(\x05R\vrequiredInt\"\xd0\x01\n" + + "\x14NullableFieldsFilter\x120\n" + + "\x04name\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12E\n" + + "\x0foptional_string\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12?\n" + + "\rinclude_nulls\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\fincludeNulls\"\x1f\n" + "\tUserInput\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\";\n" + "\vActionInput\x12\x12\n" + @@ -4671,7 +4777,15 @@ const file_product_proto_rawDesc = "" + "\fActionResult\x12A\n" + "\x0eaction_success\x18\x01 \x01(\v2\x18.productv1.ActionSuccessH\x00R\ractionSuccess\x12;\n" + "\faction_error\x18\x02 \x01(\v2\x16.productv1.ActionErrorH\x00R\vactionErrorB\a\n" + - "\x05value\"W\n" + + "\x05value\"\x88\x03\n" + + "\x13NullableFieldsInput\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12E\n" + + "\x0foptional_string\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12>\n" + + "\foptional_int\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\voptionalInt\x12C\n" + + "\x0eoptional_float\x18\x04 \x01(\v2\x1c.google.protobuf.DoubleValueR\roptionalFloat\x12E\n" + + "\x10optional_boolean\x18\x05 \x01(\v2\x1a.google.protobuf.BoolValueR\x0foptionalBoolean\x12'\n" + + "\x0frequired_string\x18\x06 \x01(\tR\x0erequiredString\x12!\n" + + "\frequired_int\x18\a \x01(\x05R\vrequiredInt\"W\n" + "\vNestedTypeB\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12$\n" + @@ -4690,17 +4804,17 @@ const file_product_proto_rawDesc = "" + "\n" + "Pagination\x12\x12\n" + "\x04page\x18\x01 \x01(\x05R\x04page\x12\x19\n" + - "\bper_page\x18\x02 \x01(\x05R\aperPage\"i\n" + + "\bper_page\x18\x02 \x01(\x05R\aperPage\"\x82\x01\n" + "\x0eOrderLineInput\x12\x1d\n" + "\n" + "product_id\x18\x01 \x01(\tR\tproductId\x12\x1a\n" + - "\bquantity\x18\x02 \x01(\x05R\bquantity\x12\x1c\n" + - "\tmodifiers\x18\x03 \x03(\tR\tmodifiers\"d\n" + + "\bquantity\x18\x02 \x01(\x05R\bquantity\x125\n" + + "\tmodifiers\x18\x03 \x01(\v2\x17.productv1.ListOfStringR\tmodifiers\"}\n" + "\tOrderLine\x12\x1d\n" + "\n" + "product_id\x18\x01 \x01(\tR\tproductId\x12\x1a\n" + - "\bquantity\x18\x02 \x01(\x05R\bquantity\x12\x1c\n" + - "\tmodifiers\x18\x03 \x03(\tR\tmodifiers\"^\n" + + "\bquantity\x18\x02 \x01(\x05R\bquantity\x125\n" + + "\tmodifiers\x18\x03 \x01(\v2\x17.productv1.ListOfStringR\tmodifiers\"^\n" + "\x03Cat\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12\x12\n" + @@ -4718,28 +4832,7 @@ const file_product_proto_rawDesc = "" + "\ttimestamp\x18\x02 \x01(\tR\ttimestamp\";\n" + "\vActionError\x12\x18\n" + "\amessage\x18\x01 \x01(\tR\amessage\x12\x12\n" + - "\x04code\x18\x02 \x01(\tR\x04code\"\x96\x03\n" + - "\x12NullableFieldsType\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + - "\x04name\x18\x02 \x01(\tR\x04name\x12E\n" + - "\x0foptional_string\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12>\n" + - "\foptional_int\x18\x04 \x01(\v2\x1b.google.protobuf.Int32ValueR\voptionalInt\x12B\n" + - "\x0eoptional_float\x18\x05 \x01(\v2\x1b.google.protobuf.FloatValueR\roptionalFloat\x12E\n" + - "\x10optional_boolean\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x0foptionalBoolean\x12'\n" + - "\x0frequired_string\x18\a \x01(\tR\x0erequiredString\x12!\n" + - "\frequired_int\x18\b \x01(\x05R\vrequiredInt\"\x87\x03\n" + - "\x13NullableFieldsInput\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\x12E\n" + - "\x0foptional_string\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12>\n" + - "\foptional_int\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\voptionalInt\x12B\n" + - "\x0eoptional_float\x18\x04 \x01(\v2\x1b.google.protobuf.FloatValueR\roptionalFloat\x12E\n" + - "\x10optional_boolean\x18\x05 \x01(\v2\x1a.google.protobuf.BoolValueR\x0foptionalBoolean\x12'\n" + - "\x0frequired_string\x18\x06 \x01(\tR\x0erequiredString\x12!\n" + - "\frequired_int\x18\a \x01(\x05R\vrequiredInt\"\xd0\x01\n" + - "\x14NullableFieldsFilter\x120\n" + - "\x04name\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12E\n" + - "\x0foptional_string\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12?\n" + - "\rinclude_nulls\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\fincludeNulls*\x9a\x01\n" + + "\x04code\x18\x02 \x01(\tR\x04code*\x9a\x01\n" + "\fCategoryKind\x12\x1d\n" + "\x19CATEGORY_KIND_UNSPECIFIED\x10\x00\x12\x16\n" + "\x12CATEGORY_KIND_BOOK\x10\x01\x12\x1d\n" + @@ -4748,9 +4841,12 @@ const file_product_proto_rawDesc = "" + "\x13CATEGORY_KIND_OTHER\x10\x042\xb2\x16\n" + "\x0eProductService\x12`\n" + "\x11LookupProductById\x12#.productv1.LookupProductByIdRequest\x1a$.productv1.LookupProductByIdResponse\"\x00\x12`\n" + - "\x11LookupStorageById\x12#.productv1.LookupStorageByIdRequest\x1a$.productv1.LookupStorageByIdResponse\"\x00\x12c\n" + + "\x11LookupStorageById\x12#.productv1.LookupStorageByIdRequest\x1a$.productv1.LookupStorageByIdResponse\"\x00\x12\x8d\x01\n" + + " MutationCreateNullableFieldsType\x122.productv1.MutationCreateNullableFieldsTypeRequest\x1a3.productv1.MutationCreateNullableFieldsTypeResponse\"\x00\x12c\n" + "\x12MutationCreateUser\x12$.productv1.MutationCreateUserRequest\x1a%.productv1.MutationCreateUserResponse\"\x00\x12l\n" + - "\x15MutationPerformAction\x12'.productv1.MutationPerformActionRequest\x1a(.productv1.MutationPerformActionResponse\"\x00\x12Q\n" + + "\x15MutationPerformAction\x12'.productv1.MutationPerformActionRequest\x1a(.productv1.MutationPerformActionResponse\"\x00\x12\x8d\x01\n" + + " MutationUpdateNullableFieldsType\x122.productv1.MutationUpdateNullableFieldsTypeRequest\x1a3.productv1.MutationUpdateNullableFieldsTypeResponse\"\x00\x12~\n" + + "\x1bQueryAllNullableFieldsTypes\x12-.productv1.QueryAllNullableFieldsTypesRequest\x1a..productv1.QueryAllNullableFieldsTypesResponse\"\x00\x12Q\n" + "\fQueryAllPets\x12\x1e.productv1.QueryAllPetsRequest\x1a\x1f.productv1.QueryAllPetsResponse\"\x00\x12i\n" + "\x14QueryCalculateTotals\x12&.productv1.QueryCalculateTotalsRequest\x1a'.productv1.QueryCalculateTotalsResponse\"\x00\x12Z\n" + "\x0fQueryCategories\x12!.productv1.QueryCategoriesRequest\x1a\".productv1.QueryCategoriesResponse\"\x00\x12l\n" + @@ -4758,7 +4854,10 @@ const file_product_proto_rawDesc = "" + "\x16QueryCategoriesByKinds\x12(.productv1.QueryCategoriesByKindsRequest\x1a).productv1.QueryCategoriesByKindsResponse\"\x00\x12o\n" + "\x16QueryComplexFilterType\x12(.productv1.QueryComplexFilterTypeRequest\x1a).productv1.QueryComplexFilterTypeResponse\"\x00\x12l\n" + "\x15QueryFilterCategories\x12'.productv1.QueryFilterCategoriesRequest\x1a(.productv1.QueryFilterCategoriesResponse\"\x00\x12Z\n" + - "\x0fQueryNestedType\x12!.productv1.QueryNestedTypeRequest\x1a\".productv1.QueryNestedTypeResponse\"\x00\x12W\n" + + "\x0fQueryNestedType\x12!.productv1.QueryNestedTypeRequest\x1a\".productv1.QueryNestedTypeResponse\"\x00\x12r\n" + + "\x17QueryNullableFieldsType\x12).productv1.QueryNullableFieldsTypeRequest\x1a*.productv1.QueryNullableFieldsTypeResponse\"\x00\x12~\n" + + "\x1bQueryNullableFieldsTypeById\x12-.productv1.QueryNullableFieldsTypeByIdRequest\x1a..productv1.QueryNullableFieldsTypeByIdResponse\"\x00\x12\x90\x01\n" + + "!QueryNullableFieldsTypeWithFilter\x123.productv1.QueryNullableFieldsTypeWithFilterRequest\x1a4.productv1.QueryNullableFieldsTypeWithFilterResponse\"\x00\x12W\n" + "\x0eQueryRandomPet\x12 .productv1.QueryRandomPetRequest\x1a!.productv1.QueryRandomPetResponse\"\x00\x12r\n" + "\x17QueryRandomSearchResult\x12).productv1.QueryRandomSearchResultRequest\x1a*.productv1.QueryRandomSearchResultResponse\"\x00\x12c\n" + "\x12QueryRecursiveType\x12$.productv1.QueryRecursiveTypeRequest\x1a%.productv1.QueryRecursiveTypeResponse\"\x00\x12N\n" + @@ -4767,13 +4866,7 @@ const file_product_proto_rawDesc = "" + "!QueryTypeWithMultipleFilterFields\x123.productv1.QueryTypeWithMultipleFilterFieldsRequest\x1a4.productv1.QueryTypeWithMultipleFilterFieldsResponse\"\x00\x12H\n" + "\tQueryUser\x12\x1b.productv1.QueryUserRequest\x1a\x1c.productv1.QueryUserResponse\"\x00\x12K\n" + "\n" + - "QueryUsers\x12\x1c.productv1.QueryUsersRequest\x1a\x1d.productv1.QueryUsersResponse\"\x00\x12r\n" + - "\x17QueryNullableFieldsType\x12).productv1.QueryNullableFieldsTypeRequest\x1a*.productv1.QueryNullableFieldsTypeResponse\"\x00\x12~\n" + - "\x1bQueryNullableFieldsTypeById\x12-.productv1.QueryNullableFieldsTypeByIdRequest\x1a..productv1.QueryNullableFieldsTypeByIdResponse\"\x00\x12\x90\x01\n" + - "!QueryNullableFieldsTypeWithFilter\x123.productv1.QueryNullableFieldsTypeWithFilterRequest\x1a4.productv1.QueryNullableFieldsTypeWithFilterResponse\"\x00\x12~\n" + - "\x1bQueryAllNullableFieldsTypes\x12-.productv1.QueryAllNullableFieldsTypesRequest\x1a..productv1.QueryAllNullableFieldsTypesResponse\"\x00\x12\x8d\x01\n" + - " MutationCreateNullableFieldsType\x122.productv1.MutationCreateNullableFieldsTypeRequest\x1a3.productv1.MutationCreateNullableFieldsTypeResponse\"\x00\x12\x8d\x01\n" + - " MutationUpdateNullableFieldsType\x122.productv1.MutationUpdateNullableFieldsTypeRequest\x1a3.productv1.MutationUpdateNullableFieldsTypeResponse\"\x00B%Z#cosmo/pkg/proto/productv1;productv1b\x06proto3" + "QueryUsers\x12\x1c.productv1.QueryUsersRequest\x1a\x1d.productv1.QueryUsersResponse\"\x00B%Z#cosmo/pkg/proto/productv1;productv1b\x06proto3" var ( file_product_proto_rawDescOnce sync.Once @@ -4788,226 +4881,232 @@ func file_product_proto_rawDescGZIP() []byte { } var file_product_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 86) +var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 88) var file_product_proto_goTypes = []any{ (CategoryKind)(0), // 0: productv1.CategoryKind - (*LookupProductByIdRequestKey)(nil), // 1: productv1.LookupProductByIdRequestKey - (*LookupProductByIdRequest)(nil), // 2: productv1.LookupProductByIdRequest - (*LookupProductByIdResponse)(nil), // 3: productv1.LookupProductByIdResponse - (*LookupStorageByIdRequestKey)(nil), // 4: productv1.LookupStorageByIdRequestKey - (*LookupStorageByIdRequest)(nil), // 5: productv1.LookupStorageByIdRequest - (*LookupStorageByIdResponse)(nil), // 6: productv1.LookupStorageByIdResponse - (*QueryUsersRequest)(nil), // 7: productv1.QueryUsersRequest - (*QueryUsersResponse)(nil), // 8: productv1.QueryUsersResponse - (*QueryUserRequest)(nil), // 9: productv1.QueryUserRequest - (*QueryUserResponse)(nil), // 10: productv1.QueryUserResponse - (*QueryNestedTypeRequest)(nil), // 11: productv1.QueryNestedTypeRequest - (*QueryNestedTypeResponse)(nil), // 12: productv1.QueryNestedTypeResponse - (*QueryRecursiveTypeRequest)(nil), // 13: productv1.QueryRecursiveTypeRequest - (*QueryRecursiveTypeResponse)(nil), // 14: productv1.QueryRecursiveTypeResponse - (*QueryTypeFilterWithArgumentsRequest)(nil), // 15: productv1.QueryTypeFilterWithArgumentsRequest - (*QueryTypeFilterWithArgumentsResponse)(nil), // 16: productv1.QueryTypeFilterWithArgumentsResponse - (*QueryTypeWithMultipleFilterFieldsRequest)(nil), // 17: productv1.QueryTypeWithMultipleFilterFieldsRequest - (*QueryTypeWithMultipleFilterFieldsResponse)(nil), // 18: productv1.QueryTypeWithMultipleFilterFieldsResponse - (*QueryComplexFilterTypeRequest)(nil), // 19: productv1.QueryComplexFilterTypeRequest - (*QueryComplexFilterTypeResponse)(nil), // 20: productv1.QueryComplexFilterTypeResponse - (*QueryCalculateTotalsRequest)(nil), // 21: productv1.QueryCalculateTotalsRequest - (*QueryCalculateTotalsResponse)(nil), // 22: productv1.QueryCalculateTotalsResponse - (*QueryCategoriesRequest)(nil), // 23: productv1.QueryCategoriesRequest - (*QueryCategoriesResponse)(nil), // 24: productv1.QueryCategoriesResponse - (*QueryCategoriesByKindRequest)(nil), // 25: productv1.QueryCategoriesByKindRequest - (*QueryCategoriesByKindResponse)(nil), // 26: productv1.QueryCategoriesByKindResponse - (*QueryCategoriesByKindsRequest)(nil), // 27: productv1.QueryCategoriesByKindsRequest - (*QueryCategoriesByKindsResponse)(nil), // 28: productv1.QueryCategoriesByKindsResponse - (*QueryFilterCategoriesRequest)(nil), // 29: productv1.QueryFilterCategoriesRequest - (*QueryFilterCategoriesResponse)(nil), // 30: productv1.QueryFilterCategoriesResponse - (*QueryRandomPetRequest)(nil), // 31: productv1.QueryRandomPetRequest - (*QueryRandomPetResponse)(nil), // 32: productv1.QueryRandomPetResponse - (*QueryAllPetsRequest)(nil), // 33: productv1.QueryAllPetsRequest - (*QueryAllPetsResponse)(nil), // 34: productv1.QueryAllPetsResponse - (*QuerySearchRequest)(nil), // 35: productv1.QuerySearchRequest - (*QuerySearchResponse)(nil), // 36: productv1.QuerySearchResponse - (*QueryRandomSearchResultRequest)(nil), // 37: productv1.QueryRandomSearchResultRequest - (*QueryRandomSearchResultResponse)(nil), // 38: productv1.QueryRandomSearchResultResponse - (*MutationCreateUserRequest)(nil), // 39: productv1.MutationCreateUserRequest - (*MutationCreateUserResponse)(nil), // 40: productv1.MutationCreateUserResponse - (*MutationPerformActionRequest)(nil), // 41: productv1.MutationPerformActionRequest - (*MutationPerformActionResponse)(nil), // 42: productv1.MutationPerformActionResponse - (*QueryNullableFieldsTypeRequest)(nil), // 43: productv1.QueryNullableFieldsTypeRequest - (*QueryNullableFieldsTypeResponse)(nil), // 44: productv1.QueryNullableFieldsTypeResponse - (*QueryNullableFieldsTypeByIdRequest)(nil), // 45: productv1.QueryNullableFieldsTypeByIdRequest - (*QueryNullableFieldsTypeByIdResponse)(nil), // 46: productv1.QueryNullableFieldsTypeByIdResponse - (*QueryNullableFieldsTypeWithFilterRequest)(nil), // 47: productv1.QueryNullableFieldsTypeWithFilterRequest - (*QueryNullableFieldsTypeWithFilterResponse)(nil), // 48: productv1.QueryNullableFieldsTypeWithFilterResponse - (*QueryAllNullableFieldsTypesRequest)(nil), // 49: productv1.QueryAllNullableFieldsTypesRequest - (*QueryAllNullableFieldsTypesResponse)(nil), // 50: productv1.QueryAllNullableFieldsTypesResponse - (*MutationCreateNullableFieldsTypeRequest)(nil), // 51: productv1.MutationCreateNullableFieldsTypeRequest - (*MutationCreateNullableFieldsTypeResponse)(nil), // 52: productv1.MutationCreateNullableFieldsTypeResponse - (*MutationUpdateNullableFieldsTypeRequest)(nil), // 53: productv1.MutationUpdateNullableFieldsTypeRequest - (*MutationUpdateNullableFieldsTypeResponse)(nil), // 54: productv1.MutationUpdateNullableFieldsTypeResponse - (*Product)(nil), // 55: productv1.Product - (*Storage)(nil), // 56: productv1.Storage - (*User)(nil), // 57: productv1.User - (*NestedTypeA)(nil), // 58: productv1.NestedTypeA - (*RecursiveType)(nil), // 59: productv1.RecursiveType - (*TypeWithMultipleFilterFields)(nil), // 60: productv1.TypeWithMultipleFilterFields - (*FilterTypeInput)(nil), // 61: productv1.FilterTypeInput - (*ComplexFilterTypeInput)(nil), // 62: productv1.ComplexFilterTypeInput - (*TypeWithComplexFilterInput)(nil), // 63: productv1.TypeWithComplexFilterInput - (*OrderInput)(nil), // 64: productv1.OrderInput - (*Order)(nil), // 65: productv1.Order - (*Category)(nil), // 66: productv1.Category - (*CategoryFilter)(nil), // 67: productv1.CategoryFilter - (*Animal)(nil), // 68: productv1.Animal - (*SearchInput)(nil), // 69: productv1.SearchInput - (*SearchResult)(nil), // 70: productv1.SearchResult - (*UserInput)(nil), // 71: productv1.UserInput - (*ActionInput)(nil), // 72: productv1.ActionInput - (*ActionResult)(nil), // 73: productv1.ActionResult - (*NestedTypeB)(nil), // 74: productv1.NestedTypeB - (*NestedTypeC)(nil), // 75: productv1.NestedTypeC - (*FilterType)(nil), // 76: productv1.FilterType - (*Pagination)(nil), // 77: productv1.Pagination - (*OrderLineInput)(nil), // 78: productv1.OrderLineInput - (*OrderLine)(nil), // 79: productv1.OrderLine - (*Cat)(nil), // 80: productv1.Cat - (*Dog)(nil), // 81: productv1.Dog - (*ActionSuccess)(nil), // 82: productv1.ActionSuccess - (*ActionError)(nil), // 83: productv1.ActionError - (*NullableFieldsType)(nil), // 84: productv1.NullableFieldsType - (*NullableFieldsInput)(nil), // 85: productv1.NullableFieldsInput - (*NullableFieldsFilter)(nil), // 86: productv1.NullableFieldsFilter - (*wrapperspb.StringValue)(nil), // 87: google.protobuf.StringValue - (*wrapperspb.Int32Value)(nil), // 88: google.protobuf.Int32Value - (*wrapperspb.FloatValue)(nil), // 89: google.protobuf.FloatValue - (*wrapperspb.BoolValue)(nil), // 90: google.protobuf.BoolValue + (*ListOfOrderLine)(nil), // 1: productv1.ListOfOrderLine + (*ListOfString)(nil), // 2: productv1.ListOfString + (*LookupProductByIdRequestKey)(nil), // 3: productv1.LookupProductByIdRequestKey + (*LookupProductByIdRequest)(nil), // 4: productv1.LookupProductByIdRequest + (*LookupProductByIdResponse)(nil), // 5: productv1.LookupProductByIdResponse + (*LookupStorageByIdRequestKey)(nil), // 6: productv1.LookupStorageByIdRequestKey + (*LookupStorageByIdRequest)(nil), // 7: productv1.LookupStorageByIdRequest + (*LookupStorageByIdResponse)(nil), // 8: productv1.LookupStorageByIdResponse + (*QueryUsersRequest)(nil), // 9: productv1.QueryUsersRequest + (*QueryUsersResponse)(nil), // 10: productv1.QueryUsersResponse + (*QueryUserRequest)(nil), // 11: productv1.QueryUserRequest + (*QueryUserResponse)(nil), // 12: productv1.QueryUserResponse + (*QueryNestedTypeRequest)(nil), // 13: productv1.QueryNestedTypeRequest + (*QueryNestedTypeResponse)(nil), // 14: productv1.QueryNestedTypeResponse + (*QueryRecursiveTypeRequest)(nil), // 15: productv1.QueryRecursiveTypeRequest + (*QueryRecursiveTypeResponse)(nil), // 16: productv1.QueryRecursiveTypeResponse + (*QueryTypeFilterWithArgumentsRequest)(nil), // 17: productv1.QueryTypeFilterWithArgumentsRequest + (*QueryTypeFilterWithArgumentsResponse)(nil), // 18: productv1.QueryTypeFilterWithArgumentsResponse + (*QueryTypeWithMultipleFilterFieldsRequest)(nil), // 19: productv1.QueryTypeWithMultipleFilterFieldsRequest + (*QueryTypeWithMultipleFilterFieldsResponse)(nil), // 20: productv1.QueryTypeWithMultipleFilterFieldsResponse + (*QueryComplexFilterTypeRequest)(nil), // 21: productv1.QueryComplexFilterTypeRequest + (*QueryComplexFilterTypeResponse)(nil), // 22: productv1.QueryComplexFilterTypeResponse + (*QueryCalculateTotalsRequest)(nil), // 23: productv1.QueryCalculateTotalsRequest + (*QueryCalculateTotalsResponse)(nil), // 24: productv1.QueryCalculateTotalsResponse + (*QueryCategoriesRequest)(nil), // 25: productv1.QueryCategoriesRequest + (*QueryCategoriesResponse)(nil), // 26: productv1.QueryCategoriesResponse + (*QueryCategoriesByKindRequest)(nil), // 27: productv1.QueryCategoriesByKindRequest + (*QueryCategoriesByKindResponse)(nil), // 28: productv1.QueryCategoriesByKindResponse + (*QueryCategoriesByKindsRequest)(nil), // 29: productv1.QueryCategoriesByKindsRequest + (*QueryCategoriesByKindsResponse)(nil), // 30: productv1.QueryCategoriesByKindsResponse + (*QueryFilterCategoriesRequest)(nil), // 31: productv1.QueryFilterCategoriesRequest + (*QueryFilterCategoriesResponse)(nil), // 32: productv1.QueryFilterCategoriesResponse + (*QueryRandomPetRequest)(nil), // 33: productv1.QueryRandomPetRequest + (*QueryRandomPetResponse)(nil), // 34: productv1.QueryRandomPetResponse + (*QueryAllPetsRequest)(nil), // 35: productv1.QueryAllPetsRequest + (*QueryAllPetsResponse)(nil), // 36: productv1.QueryAllPetsResponse + (*QuerySearchRequest)(nil), // 37: productv1.QuerySearchRequest + (*QuerySearchResponse)(nil), // 38: productv1.QuerySearchResponse + (*QueryRandomSearchResultRequest)(nil), // 39: productv1.QueryRandomSearchResultRequest + (*QueryRandomSearchResultResponse)(nil), // 40: productv1.QueryRandomSearchResultResponse + (*QueryNullableFieldsTypeRequest)(nil), // 41: productv1.QueryNullableFieldsTypeRequest + (*QueryNullableFieldsTypeResponse)(nil), // 42: productv1.QueryNullableFieldsTypeResponse + (*QueryNullableFieldsTypeByIdRequest)(nil), // 43: productv1.QueryNullableFieldsTypeByIdRequest + (*QueryNullableFieldsTypeByIdResponse)(nil), // 44: productv1.QueryNullableFieldsTypeByIdResponse + (*QueryNullableFieldsTypeWithFilterRequest)(nil), // 45: productv1.QueryNullableFieldsTypeWithFilterRequest + (*QueryNullableFieldsTypeWithFilterResponse)(nil), // 46: productv1.QueryNullableFieldsTypeWithFilterResponse + (*QueryAllNullableFieldsTypesRequest)(nil), // 47: productv1.QueryAllNullableFieldsTypesRequest + (*QueryAllNullableFieldsTypesResponse)(nil), // 48: productv1.QueryAllNullableFieldsTypesResponse + (*MutationCreateUserRequest)(nil), // 49: productv1.MutationCreateUserRequest + (*MutationCreateUserResponse)(nil), // 50: productv1.MutationCreateUserResponse + (*MutationPerformActionRequest)(nil), // 51: productv1.MutationPerformActionRequest + (*MutationPerformActionResponse)(nil), // 52: productv1.MutationPerformActionResponse + (*MutationCreateNullableFieldsTypeRequest)(nil), // 53: productv1.MutationCreateNullableFieldsTypeRequest + (*MutationCreateNullableFieldsTypeResponse)(nil), // 54: productv1.MutationCreateNullableFieldsTypeResponse + (*MutationUpdateNullableFieldsTypeRequest)(nil), // 55: productv1.MutationUpdateNullableFieldsTypeRequest + (*MutationUpdateNullableFieldsTypeResponse)(nil), // 56: productv1.MutationUpdateNullableFieldsTypeResponse + (*Product)(nil), // 57: productv1.Product + (*Storage)(nil), // 58: productv1.Storage + (*User)(nil), // 59: productv1.User + (*NestedTypeA)(nil), // 60: productv1.NestedTypeA + (*RecursiveType)(nil), // 61: productv1.RecursiveType + (*TypeWithMultipleFilterFields)(nil), // 62: productv1.TypeWithMultipleFilterFields + (*FilterTypeInput)(nil), // 63: productv1.FilterTypeInput + (*ComplexFilterTypeInput)(nil), // 64: productv1.ComplexFilterTypeInput + (*TypeWithComplexFilterInput)(nil), // 65: productv1.TypeWithComplexFilterInput + (*OrderInput)(nil), // 66: productv1.OrderInput + (*Order)(nil), // 67: productv1.Order + (*Category)(nil), // 68: productv1.Category + (*CategoryFilter)(nil), // 69: productv1.CategoryFilter + (*Animal)(nil), // 70: productv1.Animal + (*SearchInput)(nil), // 71: productv1.SearchInput + (*SearchResult)(nil), // 72: productv1.SearchResult + (*NullableFieldsType)(nil), // 73: productv1.NullableFieldsType + (*NullableFieldsFilter)(nil), // 74: productv1.NullableFieldsFilter + (*UserInput)(nil), // 75: productv1.UserInput + (*ActionInput)(nil), // 76: productv1.ActionInput + (*ActionResult)(nil), // 77: productv1.ActionResult + (*NullableFieldsInput)(nil), // 78: productv1.NullableFieldsInput + (*NestedTypeB)(nil), // 79: productv1.NestedTypeB + (*NestedTypeC)(nil), // 80: productv1.NestedTypeC + (*FilterType)(nil), // 81: productv1.FilterType + (*Pagination)(nil), // 82: productv1.Pagination + (*OrderLineInput)(nil), // 83: productv1.OrderLineInput + (*OrderLine)(nil), // 84: productv1.OrderLine + (*Cat)(nil), // 85: productv1.Cat + (*Dog)(nil), // 86: productv1.Dog + (*ActionSuccess)(nil), // 87: productv1.ActionSuccess + (*ActionError)(nil), // 88: productv1.ActionError + (*wrapperspb.Int32Value)(nil), // 89: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 90: google.protobuf.StringValue + (*wrapperspb.DoubleValue)(nil), // 91: google.protobuf.DoubleValue + (*wrapperspb.BoolValue)(nil), // 92: google.protobuf.BoolValue } var file_product_proto_depIdxs = []int32{ - 1, // 0: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey - 55, // 1: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product - 4, // 2: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey - 56, // 3: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage - 57, // 4: productv1.QueryUsersResponse.users:type_name -> productv1.User - 57, // 5: productv1.QueryUserResponse.user:type_name -> productv1.User - 58, // 6: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA - 59, // 7: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType - 60, // 8: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields - 61, // 9: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput - 60, // 10: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields - 62, // 11: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput - 63, // 12: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput - 64, // 13: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput - 65, // 14: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order - 66, // 15: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category - 0, // 16: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind - 66, // 17: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category - 0, // 18: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind - 66, // 19: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category - 67, // 20: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter - 66, // 21: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category - 68, // 22: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal - 68, // 23: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal - 69, // 24: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput - 70, // 25: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult - 70, // 26: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult - 71, // 27: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput - 57, // 28: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User - 72, // 29: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput - 73, // 30: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult - 84, // 31: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType - 84, // 32: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType - 86, // 33: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter - 84, // 34: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType - 84, // 35: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType - 85, // 36: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 84, // 37: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType - 85, // 38: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 84, // 39: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType - 74, // 40: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB - 59, // 41: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType - 76, // 42: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType - 78, // 43: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput - 79, // 44: productv1.Order.order_lines:type_name -> productv1.OrderLine - 0, // 45: productv1.Category.kind:type_name -> productv1.CategoryKind - 0, // 46: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind - 77, // 47: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination - 80, // 48: productv1.Animal.cat:type_name -> productv1.Cat - 81, // 49: productv1.Animal.dog:type_name -> productv1.Dog - 55, // 50: productv1.SearchResult.product:type_name -> productv1.Product - 57, // 51: productv1.SearchResult.user:type_name -> productv1.User - 66, // 52: productv1.SearchResult.category:type_name -> productv1.Category - 82, // 53: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess - 83, // 54: productv1.ActionResult.action_error:type_name -> productv1.ActionError - 75, // 55: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC - 77, // 56: productv1.FilterType.pagination:type_name -> productv1.Pagination - 87, // 57: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue - 88, // 58: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value - 89, // 59: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.FloatValue - 90, // 60: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue - 87, // 61: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue - 88, // 62: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value - 89, // 63: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.FloatValue - 90, // 64: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue - 87, // 65: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue - 87, // 66: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue - 90, // 67: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue - 2, // 68: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest - 5, // 69: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest - 39, // 70: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest - 41, // 71: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest - 33, // 72: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest - 21, // 73: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest - 23, // 74: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest - 25, // 75: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest - 27, // 76: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest - 19, // 77: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest - 29, // 78: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest - 11, // 79: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest - 31, // 80: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest - 37, // 81: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest - 13, // 82: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest - 35, // 83: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest - 15, // 84: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest - 17, // 85: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest - 9, // 86: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest - 7, // 87: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest - 43, // 88: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest - 45, // 89: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest - 47, // 90: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest - 49, // 91: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest - 51, // 92: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest - 53, // 93: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest - 3, // 94: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse - 6, // 95: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse - 40, // 96: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse - 42, // 97: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse - 34, // 98: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse - 22, // 99: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse - 24, // 100: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse - 26, // 101: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse - 28, // 102: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse - 20, // 103: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse - 30, // 104: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse - 12, // 105: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse - 32, // 106: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse - 38, // 107: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse - 14, // 108: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse - 36, // 109: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse - 16, // 110: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse - 18, // 111: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse - 10, // 112: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse - 8, // 113: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse - 44, // 114: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse - 46, // 115: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse - 48, // 116: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse - 50, // 117: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse - 52, // 118: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse - 54, // 119: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse - 94, // [94:120] is the sub-list for method output_type - 68, // [68:94] is the sub-list for method input_type - 68, // [68:68] is the sub-list for extension type_name - 68, // [68:68] is the sub-list for extension extendee - 0, // [0:68] is the sub-list for field type_name + 84, // 0: productv1.ListOfOrderLine.items:type_name -> productv1.OrderLine + 3, // 1: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey + 57, // 2: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product + 6, // 3: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey + 58, // 4: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage + 59, // 5: productv1.QueryUsersResponse.users:type_name -> productv1.User + 59, // 6: productv1.QueryUserResponse.user:type_name -> productv1.User + 60, // 7: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA + 61, // 8: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType + 62, // 9: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields + 63, // 10: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput + 62, // 11: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields + 64, // 12: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput + 65, // 13: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput + 66, // 14: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput + 67, // 15: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order + 68, // 16: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category + 0, // 17: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind + 68, // 18: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category + 0, // 19: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind + 68, // 20: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category + 69, // 21: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter + 68, // 22: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category + 70, // 23: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal + 70, // 24: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal + 71, // 25: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput + 72, // 26: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult + 72, // 27: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult + 73, // 28: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType + 73, // 29: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType + 74, // 30: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter + 73, // 31: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType + 73, // 32: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType + 75, // 33: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput + 59, // 34: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User + 76, // 35: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput + 77, // 36: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult + 78, // 37: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 73, // 38: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType + 78, // 39: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 73, // 40: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType + 79, // 41: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB + 61, // 42: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType + 81, // 43: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType + 83, // 44: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput + 1, // 45: productv1.Order.order_lines:type_name -> productv1.ListOfOrderLine + 0, // 46: productv1.Category.kind:type_name -> productv1.CategoryKind + 0, // 47: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind + 82, // 48: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination + 85, // 49: productv1.Animal.cat:type_name -> productv1.Cat + 86, // 50: productv1.Animal.dog:type_name -> productv1.Dog + 89, // 51: productv1.SearchInput.limit:type_name -> google.protobuf.Int32Value + 57, // 52: productv1.SearchResult.product:type_name -> productv1.Product + 59, // 53: productv1.SearchResult.user:type_name -> productv1.User + 68, // 54: productv1.SearchResult.category:type_name -> productv1.Category + 90, // 55: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue + 89, // 56: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value + 91, // 57: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.DoubleValue + 92, // 58: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue + 90, // 59: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue + 90, // 60: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue + 92, // 61: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue + 87, // 62: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess + 88, // 63: productv1.ActionResult.action_error:type_name -> productv1.ActionError + 90, // 64: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue + 89, // 65: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value + 91, // 66: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.DoubleValue + 92, // 67: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue + 80, // 68: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC + 82, // 69: productv1.FilterType.pagination:type_name -> productv1.Pagination + 2, // 70: productv1.OrderLineInput.modifiers:type_name -> productv1.ListOfString + 2, // 71: productv1.OrderLine.modifiers:type_name -> productv1.ListOfString + 4, // 72: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest + 7, // 73: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest + 53, // 74: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest + 49, // 75: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest + 51, // 76: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest + 55, // 77: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest + 47, // 78: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest + 35, // 79: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest + 23, // 80: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest + 25, // 81: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest + 27, // 82: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest + 29, // 83: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest + 21, // 84: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest + 31, // 85: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest + 13, // 86: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest + 41, // 87: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest + 43, // 88: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest + 45, // 89: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest + 33, // 90: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest + 39, // 91: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest + 15, // 92: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest + 37, // 93: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest + 17, // 94: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest + 19, // 95: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest + 11, // 96: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest + 9, // 97: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest + 5, // 98: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse + 8, // 99: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse + 54, // 100: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse + 50, // 101: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse + 52, // 102: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse + 56, // 103: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse + 48, // 104: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse + 36, // 105: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse + 24, // 106: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse + 26, // 107: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse + 28, // 108: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse + 30, // 109: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse + 22, // 110: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse + 32, // 111: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse + 14, // 112: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse + 42, // 113: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse + 44, // 114: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse + 46, // 115: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse + 34, // 116: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse + 40, // 117: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse + 16, // 118: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse + 38, // 119: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse + 18, // 120: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse + 20, // 121: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse + 12, // 122: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse + 10, // 123: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse + 98, // [98:124] is the sub-list for method output_type + 72, // [72:98] is the sub-list for method input_type + 72, // [72:72] is the sub-list for extension type_name + 72, // [72:72] is the sub-list for extension extendee + 0, // [0:72] is the sub-list for field type_name } func init() { file_product_proto_init() } @@ -5015,16 +5114,16 @@ func file_product_proto_init() { if File_product_proto != nil { return } - file_product_proto_msgTypes[67].OneofWrappers = []any{ + file_product_proto_msgTypes[69].OneofWrappers = []any{ (*Animal_Cat)(nil), (*Animal_Dog)(nil), } - file_product_proto_msgTypes[69].OneofWrappers = []any{ + file_product_proto_msgTypes[71].OneofWrappers = []any{ (*SearchResult_Product)(nil), (*SearchResult_User)(nil), (*SearchResult_Category)(nil), } - file_product_proto_msgTypes[72].OneofWrappers = []any{ + file_product_proto_msgTypes[76].OneofWrappers = []any{ (*ActionResult_ActionSuccess)(nil), (*ActionResult_ActionError)(nil), } @@ -5034,7 +5133,7 @@ func file_product_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_product_proto_rawDesc), len(file_product_proto_rawDesc)), NumEnums: 1, - NumMessages: 86, + NumMessages: 88, NumExtensions: 0, NumServices: 1, }, diff --git a/v2/pkg/grpctest/productv1/product_grpc.pb.go b/v2/pkg/grpctest/productv1/product_grpc.pb.go index 6ce5c39e95..5a9c27deb2 100644 --- a/v2/pkg/grpctest/productv1/product_grpc.pb.go +++ b/v2/pkg/grpctest/productv1/product_grpc.pb.go @@ -21,8 +21,11 @@ const _ = grpc.SupportPackageIsVersion9 const ( ProductService_LookupProductById_FullMethodName = "/productv1.ProductService/LookupProductById" ProductService_LookupStorageById_FullMethodName = "/productv1.ProductService/LookupStorageById" + ProductService_MutationCreateNullableFieldsType_FullMethodName = "/productv1.ProductService/MutationCreateNullableFieldsType" ProductService_MutationCreateUser_FullMethodName = "/productv1.ProductService/MutationCreateUser" ProductService_MutationPerformAction_FullMethodName = "/productv1.ProductService/MutationPerformAction" + ProductService_MutationUpdateNullableFieldsType_FullMethodName = "/productv1.ProductService/MutationUpdateNullableFieldsType" + ProductService_QueryAllNullableFieldsTypes_FullMethodName = "/productv1.ProductService/QueryAllNullableFieldsTypes" ProductService_QueryAllPets_FullMethodName = "/productv1.ProductService/QueryAllPets" ProductService_QueryCalculateTotals_FullMethodName = "/productv1.ProductService/QueryCalculateTotals" ProductService_QueryCategories_FullMethodName = "/productv1.ProductService/QueryCategories" @@ -31,6 +34,9 @@ const ( ProductService_QueryComplexFilterType_FullMethodName = "/productv1.ProductService/QueryComplexFilterType" ProductService_QueryFilterCategories_FullMethodName = "/productv1.ProductService/QueryFilterCategories" ProductService_QueryNestedType_FullMethodName = "/productv1.ProductService/QueryNestedType" + ProductService_QueryNullableFieldsType_FullMethodName = "/productv1.ProductService/QueryNullableFieldsType" + ProductService_QueryNullableFieldsTypeById_FullMethodName = "/productv1.ProductService/QueryNullableFieldsTypeById" + ProductService_QueryNullableFieldsTypeWithFilter_FullMethodName = "/productv1.ProductService/QueryNullableFieldsTypeWithFilter" ProductService_QueryRandomPet_FullMethodName = "/productv1.ProductService/QueryRandomPet" ProductService_QueryRandomSearchResult_FullMethodName = "/productv1.ProductService/QueryRandomSearchResult" ProductService_QueryRecursiveType_FullMethodName = "/productv1.ProductService/QueryRecursiveType" @@ -39,12 +45,6 @@ const ( ProductService_QueryTypeWithMultipleFilterFields_FullMethodName = "/productv1.ProductService/QueryTypeWithMultipleFilterFields" ProductService_QueryUser_FullMethodName = "/productv1.ProductService/QueryUser" ProductService_QueryUsers_FullMethodName = "/productv1.ProductService/QueryUsers" - ProductService_QueryNullableFieldsType_FullMethodName = "/productv1.ProductService/QueryNullableFieldsType" - ProductService_QueryNullableFieldsTypeById_FullMethodName = "/productv1.ProductService/QueryNullableFieldsTypeById" - ProductService_QueryNullableFieldsTypeWithFilter_FullMethodName = "/productv1.ProductService/QueryNullableFieldsTypeWithFilter" - ProductService_QueryAllNullableFieldsTypes_FullMethodName = "/productv1.ProductService/QueryAllNullableFieldsTypes" - ProductService_MutationCreateNullableFieldsType_FullMethodName = "/productv1.ProductService/MutationCreateNullableFieldsType" - ProductService_MutationUpdateNullableFieldsType_FullMethodName = "/productv1.ProductService/MutationUpdateNullableFieldsType" ) // ProductServiceClient is the client API for ProductService service. @@ -57,8 +57,11 @@ type ProductServiceClient interface { LookupProductById(ctx context.Context, in *LookupProductByIdRequest, opts ...grpc.CallOption) (*LookupProductByIdResponse, error) // Lookup Storage entity by id LookupStorageById(ctx context.Context, in *LookupStorageByIdRequest, opts ...grpc.CallOption) (*LookupStorageByIdResponse, error) + MutationCreateNullableFieldsType(ctx context.Context, in *MutationCreateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationCreateNullableFieldsTypeResponse, error) MutationCreateUser(ctx context.Context, in *MutationCreateUserRequest, opts ...grpc.CallOption) (*MutationCreateUserResponse, error) MutationPerformAction(ctx context.Context, in *MutationPerformActionRequest, opts ...grpc.CallOption) (*MutationPerformActionResponse, error) + MutationUpdateNullableFieldsType(ctx context.Context, in *MutationUpdateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationUpdateNullableFieldsTypeResponse, error) + QueryAllNullableFieldsTypes(ctx context.Context, in *QueryAllNullableFieldsTypesRequest, opts ...grpc.CallOption) (*QueryAllNullableFieldsTypesResponse, error) QueryAllPets(ctx context.Context, in *QueryAllPetsRequest, opts ...grpc.CallOption) (*QueryAllPetsResponse, error) QueryCalculateTotals(ctx context.Context, in *QueryCalculateTotalsRequest, opts ...grpc.CallOption) (*QueryCalculateTotalsResponse, error) QueryCategories(ctx context.Context, in *QueryCategoriesRequest, opts ...grpc.CallOption) (*QueryCategoriesResponse, error) @@ -67,6 +70,9 @@ type ProductServiceClient interface { QueryComplexFilterType(ctx context.Context, in *QueryComplexFilterTypeRequest, opts ...grpc.CallOption) (*QueryComplexFilterTypeResponse, error) QueryFilterCategories(ctx context.Context, in *QueryFilterCategoriesRequest, opts ...grpc.CallOption) (*QueryFilterCategoriesResponse, error) QueryNestedType(ctx context.Context, in *QueryNestedTypeRequest, opts ...grpc.CallOption) (*QueryNestedTypeResponse, error) + QueryNullableFieldsType(ctx context.Context, in *QueryNullableFieldsTypeRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeResponse, error) + QueryNullableFieldsTypeById(ctx context.Context, in *QueryNullableFieldsTypeByIdRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeByIdResponse, error) + QueryNullableFieldsTypeWithFilter(ctx context.Context, in *QueryNullableFieldsTypeWithFilterRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeWithFilterResponse, error) QueryRandomPet(ctx context.Context, in *QueryRandomPetRequest, opts ...grpc.CallOption) (*QueryRandomPetResponse, error) QueryRandomSearchResult(ctx context.Context, in *QueryRandomSearchResultRequest, opts ...grpc.CallOption) (*QueryRandomSearchResultResponse, error) QueryRecursiveType(ctx context.Context, in *QueryRecursiveTypeRequest, opts ...grpc.CallOption) (*QueryRecursiveTypeResponse, error) @@ -75,13 +81,6 @@ type ProductServiceClient interface { QueryTypeWithMultipleFilterFields(ctx context.Context, in *QueryTypeWithMultipleFilterFieldsRequest, opts ...grpc.CallOption) (*QueryTypeWithMultipleFilterFieldsResponse, error) QueryUser(ctx context.Context, in *QueryUserRequest, opts ...grpc.CallOption) (*QueryUserResponse, error) QueryUsers(ctx context.Context, in *QueryUsersRequest, opts ...grpc.CallOption) (*QueryUsersResponse, error) - // Nullable fields RPCs - QueryNullableFieldsType(ctx context.Context, in *QueryNullableFieldsTypeRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeResponse, error) - QueryNullableFieldsTypeById(ctx context.Context, in *QueryNullableFieldsTypeByIdRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeByIdResponse, error) - QueryNullableFieldsTypeWithFilter(ctx context.Context, in *QueryNullableFieldsTypeWithFilterRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeWithFilterResponse, error) - QueryAllNullableFieldsTypes(ctx context.Context, in *QueryAllNullableFieldsTypesRequest, opts ...grpc.CallOption) (*QueryAllNullableFieldsTypesResponse, error) - MutationCreateNullableFieldsType(ctx context.Context, in *MutationCreateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationCreateNullableFieldsTypeResponse, error) - MutationUpdateNullableFieldsType(ctx context.Context, in *MutationUpdateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationUpdateNullableFieldsTypeResponse, error) } type productServiceClient struct { @@ -112,6 +111,16 @@ func (c *productServiceClient) LookupStorageById(ctx context.Context, in *Lookup return out, nil } +func (c *productServiceClient) MutationCreateNullableFieldsType(ctx context.Context, in *MutationCreateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationCreateNullableFieldsTypeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(MutationCreateNullableFieldsTypeResponse) + err := c.cc.Invoke(ctx, ProductService_MutationCreateNullableFieldsType_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) MutationCreateUser(ctx context.Context, in *MutationCreateUserRequest, opts ...grpc.CallOption) (*MutationCreateUserResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(MutationCreateUserResponse) @@ -132,6 +141,26 @@ func (c *productServiceClient) MutationPerformAction(ctx context.Context, in *Mu return out, nil } +func (c *productServiceClient) MutationUpdateNullableFieldsType(ctx context.Context, in *MutationUpdateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationUpdateNullableFieldsTypeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(MutationUpdateNullableFieldsTypeResponse) + err := c.cc.Invoke(ctx, ProductService_MutationUpdateNullableFieldsType_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryAllNullableFieldsTypes(ctx context.Context, in *QueryAllNullableFieldsTypesRequest, opts ...grpc.CallOption) (*QueryAllNullableFieldsTypesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryAllNullableFieldsTypesResponse) + err := c.cc.Invoke(ctx, ProductService_QueryAllNullableFieldsTypes_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) QueryAllPets(ctx context.Context, in *QueryAllPetsRequest, opts ...grpc.CallOption) (*QueryAllPetsResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(QueryAllPetsResponse) @@ -212,6 +241,36 @@ func (c *productServiceClient) QueryNestedType(ctx context.Context, in *QueryNes return out, nil } +func (c *productServiceClient) QueryNullableFieldsType(ctx context.Context, in *QueryNullableFieldsTypeRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryNullableFieldsTypeResponse) + err := c.cc.Invoke(ctx, ProductService_QueryNullableFieldsType_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryNullableFieldsTypeById(ctx context.Context, in *QueryNullableFieldsTypeByIdRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeByIdResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryNullableFieldsTypeByIdResponse) + err := c.cc.Invoke(ctx, ProductService_QueryNullableFieldsTypeById_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryNullableFieldsTypeWithFilter(ctx context.Context, in *QueryNullableFieldsTypeWithFilterRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeWithFilterResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryNullableFieldsTypeWithFilterResponse) + err := c.cc.Invoke(ctx, ProductService_QueryNullableFieldsTypeWithFilter_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) QueryRandomPet(ctx context.Context, in *QueryRandomPetRequest, opts ...grpc.CallOption) (*QueryRandomPetResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(QueryRandomPetResponse) @@ -292,66 +351,6 @@ func (c *productServiceClient) QueryUsers(ctx context.Context, in *QueryUsersReq return out, nil } -func (c *productServiceClient) QueryNullableFieldsType(ctx context.Context, in *QueryNullableFieldsTypeRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(QueryNullableFieldsTypeResponse) - err := c.cc.Invoke(ctx, ProductService_QueryNullableFieldsType_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *productServiceClient) QueryNullableFieldsTypeById(ctx context.Context, in *QueryNullableFieldsTypeByIdRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeByIdResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(QueryNullableFieldsTypeByIdResponse) - err := c.cc.Invoke(ctx, ProductService_QueryNullableFieldsTypeById_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *productServiceClient) QueryNullableFieldsTypeWithFilter(ctx context.Context, in *QueryNullableFieldsTypeWithFilterRequest, opts ...grpc.CallOption) (*QueryNullableFieldsTypeWithFilterResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(QueryNullableFieldsTypeWithFilterResponse) - err := c.cc.Invoke(ctx, ProductService_QueryNullableFieldsTypeWithFilter_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *productServiceClient) QueryAllNullableFieldsTypes(ctx context.Context, in *QueryAllNullableFieldsTypesRequest, opts ...grpc.CallOption) (*QueryAllNullableFieldsTypesResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(QueryAllNullableFieldsTypesResponse) - err := c.cc.Invoke(ctx, ProductService_QueryAllNullableFieldsTypes_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *productServiceClient) MutationCreateNullableFieldsType(ctx context.Context, in *MutationCreateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationCreateNullableFieldsTypeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(MutationCreateNullableFieldsTypeResponse) - err := c.cc.Invoke(ctx, ProductService_MutationCreateNullableFieldsType_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *productServiceClient) MutationUpdateNullableFieldsType(ctx context.Context, in *MutationUpdateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationUpdateNullableFieldsTypeResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(MutationUpdateNullableFieldsTypeResponse) - err := c.cc.Invoke(ctx, ProductService_MutationUpdateNullableFieldsType_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - // ProductServiceServer is the server API for ProductService service. // All implementations must embed UnimplementedProductServiceServer // for forward compatibility. @@ -362,8 +361,11 @@ type ProductServiceServer interface { LookupProductById(context.Context, *LookupProductByIdRequest) (*LookupProductByIdResponse, error) // Lookup Storage entity by id LookupStorageById(context.Context, *LookupStorageByIdRequest) (*LookupStorageByIdResponse, error) + MutationCreateNullableFieldsType(context.Context, *MutationCreateNullableFieldsTypeRequest) (*MutationCreateNullableFieldsTypeResponse, error) MutationCreateUser(context.Context, *MutationCreateUserRequest) (*MutationCreateUserResponse, error) MutationPerformAction(context.Context, *MutationPerformActionRequest) (*MutationPerformActionResponse, error) + MutationUpdateNullableFieldsType(context.Context, *MutationUpdateNullableFieldsTypeRequest) (*MutationUpdateNullableFieldsTypeResponse, error) + QueryAllNullableFieldsTypes(context.Context, *QueryAllNullableFieldsTypesRequest) (*QueryAllNullableFieldsTypesResponse, error) QueryAllPets(context.Context, *QueryAllPetsRequest) (*QueryAllPetsResponse, error) QueryCalculateTotals(context.Context, *QueryCalculateTotalsRequest) (*QueryCalculateTotalsResponse, error) QueryCategories(context.Context, *QueryCategoriesRequest) (*QueryCategoriesResponse, error) @@ -372,6 +374,9 @@ type ProductServiceServer interface { QueryComplexFilterType(context.Context, *QueryComplexFilterTypeRequest) (*QueryComplexFilterTypeResponse, error) QueryFilterCategories(context.Context, *QueryFilterCategoriesRequest) (*QueryFilterCategoriesResponse, error) QueryNestedType(context.Context, *QueryNestedTypeRequest) (*QueryNestedTypeResponse, error) + QueryNullableFieldsType(context.Context, *QueryNullableFieldsTypeRequest) (*QueryNullableFieldsTypeResponse, error) + QueryNullableFieldsTypeById(context.Context, *QueryNullableFieldsTypeByIdRequest) (*QueryNullableFieldsTypeByIdResponse, error) + QueryNullableFieldsTypeWithFilter(context.Context, *QueryNullableFieldsTypeWithFilterRequest) (*QueryNullableFieldsTypeWithFilterResponse, error) QueryRandomPet(context.Context, *QueryRandomPetRequest) (*QueryRandomPetResponse, error) QueryRandomSearchResult(context.Context, *QueryRandomSearchResultRequest) (*QueryRandomSearchResultResponse, error) QueryRecursiveType(context.Context, *QueryRecursiveTypeRequest) (*QueryRecursiveTypeResponse, error) @@ -380,13 +385,6 @@ type ProductServiceServer interface { QueryTypeWithMultipleFilterFields(context.Context, *QueryTypeWithMultipleFilterFieldsRequest) (*QueryTypeWithMultipleFilterFieldsResponse, error) QueryUser(context.Context, *QueryUserRequest) (*QueryUserResponse, error) QueryUsers(context.Context, *QueryUsersRequest) (*QueryUsersResponse, error) - // Nullable fields RPCs - QueryNullableFieldsType(context.Context, *QueryNullableFieldsTypeRequest) (*QueryNullableFieldsTypeResponse, error) - QueryNullableFieldsTypeById(context.Context, *QueryNullableFieldsTypeByIdRequest) (*QueryNullableFieldsTypeByIdResponse, error) - QueryNullableFieldsTypeWithFilter(context.Context, *QueryNullableFieldsTypeWithFilterRequest) (*QueryNullableFieldsTypeWithFilterResponse, error) - QueryAllNullableFieldsTypes(context.Context, *QueryAllNullableFieldsTypesRequest) (*QueryAllNullableFieldsTypesResponse, error) - MutationCreateNullableFieldsType(context.Context, *MutationCreateNullableFieldsTypeRequest) (*MutationCreateNullableFieldsTypeResponse, error) - MutationUpdateNullableFieldsType(context.Context, *MutationUpdateNullableFieldsTypeRequest) (*MutationUpdateNullableFieldsTypeResponse, error) mustEmbedUnimplementedProductServiceServer() } @@ -403,12 +401,21 @@ func (UnimplementedProductServiceServer) LookupProductById(context.Context, *Loo func (UnimplementedProductServiceServer) LookupStorageById(context.Context, *LookupStorageByIdRequest) (*LookupStorageByIdResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LookupStorageById not implemented") } +func (UnimplementedProductServiceServer) MutationCreateNullableFieldsType(context.Context, *MutationCreateNullableFieldsTypeRequest) (*MutationCreateNullableFieldsTypeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MutationCreateNullableFieldsType not implemented") +} func (UnimplementedProductServiceServer) MutationCreateUser(context.Context, *MutationCreateUserRequest) (*MutationCreateUserResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MutationCreateUser not implemented") } func (UnimplementedProductServiceServer) MutationPerformAction(context.Context, *MutationPerformActionRequest) (*MutationPerformActionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MutationPerformAction not implemented") } +func (UnimplementedProductServiceServer) MutationUpdateNullableFieldsType(context.Context, *MutationUpdateNullableFieldsTypeRequest) (*MutationUpdateNullableFieldsTypeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MutationUpdateNullableFieldsType not implemented") +} +func (UnimplementedProductServiceServer) QueryAllNullableFieldsTypes(context.Context, *QueryAllNullableFieldsTypesRequest) (*QueryAllNullableFieldsTypesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryAllNullableFieldsTypes not implemented") +} func (UnimplementedProductServiceServer) QueryAllPets(context.Context, *QueryAllPetsRequest) (*QueryAllPetsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryAllPets not implemented") } @@ -433,6 +440,15 @@ func (UnimplementedProductServiceServer) QueryFilterCategories(context.Context, func (UnimplementedProductServiceServer) QueryNestedType(context.Context, *QueryNestedTypeRequest) (*QueryNestedTypeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryNestedType not implemented") } +func (UnimplementedProductServiceServer) QueryNullableFieldsType(context.Context, *QueryNullableFieldsTypeRequest) (*QueryNullableFieldsTypeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryNullableFieldsType not implemented") +} +func (UnimplementedProductServiceServer) QueryNullableFieldsTypeById(context.Context, *QueryNullableFieldsTypeByIdRequest) (*QueryNullableFieldsTypeByIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryNullableFieldsTypeById not implemented") +} +func (UnimplementedProductServiceServer) QueryNullableFieldsTypeWithFilter(context.Context, *QueryNullableFieldsTypeWithFilterRequest) (*QueryNullableFieldsTypeWithFilterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryNullableFieldsTypeWithFilter not implemented") +} func (UnimplementedProductServiceServer) QueryRandomPet(context.Context, *QueryRandomPetRequest) (*QueryRandomPetResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryRandomPet not implemented") } @@ -457,24 +473,6 @@ func (UnimplementedProductServiceServer) QueryUser(context.Context, *QueryUserRe func (UnimplementedProductServiceServer) QueryUsers(context.Context, *QueryUsersRequest) (*QueryUsersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryUsers not implemented") } -func (UnimplementedProductServiceServer) QueryNullableFieldsType(context.Context, *QueryNullableFieldsTypeRequest) (*QueryNullableFieldsTypeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryNullableFieldsType not implemented") -} -func (UnimplementedProductServiceServer) QueryNullableFieldsTypeById(context.Context, *QueryNullableFieldsTypeByIdRequest) (*QueryNullableFieldsTypeByIdResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryNullableFieldsTypeById not implemented") -} -func (UnimplementedProductServiceServer) QueryNullableFieldsTypeWithFilter(context.Context, *QueryNullableFieldsTypeWithFilterRequest) (*QueryNullableFieldsTypeWithFilterResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryNullableFieldsTypeWithFilter not implemented") -} -func (UnimplementedProductServiceServer) QueryAllNullableFieldsTypes(context.Context, *QueryAllNullableFieldsTypesRequest) (*QueryAllNullableFieldsTypesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryAllNullableFieldsTypes not implemented") -} -func (UnimplementedProductServiceServer) MutationCreateNullableFieldsType(context.Context, *MutationCreateNullableFieldsTypeRequest) (*MutationCreateNullableFieldsTypeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method MutationCreateNullableFieldsType not implemented") -} -func (UnimplementedProductServiceServer) MutationUpdateNullableFieldsType(context.Context, *MutationUpdateNullableFieldsTypeRequest) (*MutationUpdateNullableFieldsTypeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method MutationUpdateNullableFieldsType not implemented") -} func (UnimplementedProductServiceServer) mustEmbedUnimplementedProductServiceServer() {} func (UnimplementedProductServiceServer) testEmbeddedByValue() {} @@ -532,6 +530,24 @@ func _ProductService_LookupStorageById_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _ProductService_MutationCreateNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MutationCreateNullableFieldsTypeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).MutationCreateNullableFieldsType(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_MutationCreateNullableFieldsType_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).MutationCreateNullableFieldsType(ctx, req.(*MutationCreateNullableFieldsTypeRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_MutationCreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MutationCreateUserRequest) if err := dec(in); err != nil { @@ -568,6 +584,42 @@ func _ProductService_MutationPerformAction_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ProductService_MutationUpdateNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MutationUpdateNullableFieldsTypeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).MutationUpdateNullableFieldsType(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_MutationUpdateNullableFieldsType_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).MutationUpdateNullableFieldsType(ctx, req.(*MutationUpdateNullableFieldsTypeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryAllNullableFieldsTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllNullableFieldsTypesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryAllNullableFieldsTypes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryAllNullableFieldsTypes_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryAllNullableFieldsTypes(ctx, req.(*QueryAllNullableFieldsTypesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_QueryAllPets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryAllPetsRequest) if err := dec(in); err != nil { @@ -712,6 +764,60 @@ func _ProductService_QueryNestedType_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _ProductService_QueryNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryNullableFieldsTypeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryNullableFieldsType(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryNullableFieldsType_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryNullableFieldsType(ctx, req.(*QueryNullableFieldsTypeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryNullableFieldsTypeById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryNullableFieldsTypeByIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryNullableFieldsTypeById(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryNullableFieldsTypeById_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryNullableFieldsTypeById(ctx, req.(*QueryNullableFieldsTypeByIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryNullableFieldsTypeWithFilter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryNullableFieldsTypeWithFilterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryNullableFieldsTypeWithFilter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryNullableFieldsTypeWithFilter_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryNullableFieldsTypeWithFilter(ctx, req.(*QueryNullableFieldsTypeWithFilterRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_QueryRandomPet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryRandomPetRequest) if err := dec(in); err != nil { @@ -856,114 +962,6 @@ func _ProductService_QueryUsers_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } -func _ProductService_QueryNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryNullableFieldsTypeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProductServiceServer).QueryNullableFieldsType(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ProductService_QueryNullableFieldsType_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProductServiceServer).QueryNullableFieldsType(ctx, req.(*QueryNullableFieldsTypeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ProductService_QueryNullableFieldsTypeById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryNullableFieldsTypeByIdRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProductServiceServer).QueryNullableFieldsTypeById(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ProductService_QueryNullableFieldsTypeById_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProductServiceServer).QueryNullableFieldsTypeById(ctx, req.(*QueryNullableFieldsTypeByIdRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ProductService_QueryNullableFieldsTypeWithFilter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryNullableFieldsTypeWithFilterRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProductServiceServer).QueryNullableFieldsTypeWithFilter(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ProductService_QueryNullableFieldsTypeWithFilter_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProductServiceServer).QueryNullableFieldsTypeWithFilter(ctx, req.(*QueryNullableFieldsTypeWithFilterRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ProductService_QueryAllNullableFieldsTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryAllNullableFieldsTypesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProductServiceServer).QueryAllNullableFieldsTypes(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ProductService_QueryAllNullableFieldsTypes_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProductServiceServer).QueryAllNullableFieldsTypes(ctx, req.(*QueryAllNullableFieldsTypesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ProductService_MutationCreateNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MutationCreateNullableFieldsTypeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProductServiceServer).MutationCreateNullableFieldsType(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ProductService_MutationCreateNullableFieldsType_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProductServiceServer).MutationCreateNullableFieldsType(ctx, req.(*MutationCreateNullableFieldsTypeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ProductService_MutationUpdateNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MutationUpdateNullableFieldsTypeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProductServiceServer).MutationUpdateNullableFieldsType(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ProductService_MutationUpdateNullableFieldsType_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProductServiceServer).MutationUpdateNullableFieldsType(ctx, req.(*MutationUpdateNullableFieldsTypeRequest)) - } - return interceptor(ctx, in, info, handler) -} - // ProductService_ServiceDesc is the grpc.ServiceDesc for ProductService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -979,6 +977,10 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "LookupStorageById", Handler: _ProductService_LookupStorageById_Handler, }, + { + MethodName: "MutationCreateNullableFieldsType", + Handler: _ProductService_MutationCreateNullableFieldsType_Handler, + }, { MethodName: "MutationCreateUser", Handler: _ProductService_MutationCreateUser_Handler, @@ -987,6 +989,14 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "MutationPerformAction", Handler: _ProductService_MutationPerformAction_Handler, }, + { + MethodName: "MutationUpdateNullableFieldsType", + Handler: _ProductService_MutationUpdateNullableFieldsType_Handler, + }, + { + MethodName: "QueryAllNullableFieldsTypes", + Handler: _ProductService_QueryAllNullableFieldsTypes_Handler, + }, { MethodName: "QueryAllPets", Handler: _ProductService_QueryAllPets_Handler, @@ -1019,6 +1029,18 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "QueryNestedType", Handler: _ProductService_QueryNestedType_Handler, }, + { + MethodName: "QueryNullableFieldsType", + Handler: _ProductService_QueryNullableFieldsType_Handler, + }, + { + MethodName: "QueryNullableFieldsTypeById", + Handler: _ProductService_QueryNullableFieldsTypeById_Handler, + }, + { + MethodName: "QueryNullableFieldsTypeWithFilter", + Handler: _ProductService_QueryNullableFieldsTypeWithFilter_Handler, + }, { MethodName: "QueryRandomPet", Handler: _ProductService_QueryRandomPet_Handler, @@ -1051,30 +1073,6 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "QueryUsers", Handler: _ProductService_QueryUsers_Handler, }, - { - MethodName: "QueryNullableFieldsType", - Handler: _ProductService_QueryNullableFieldsType_Handler, - }, - { - MethodName: "QueryNullableFieldsTypeById", - Handler: _ProductService_QueryNullableFieldsTypeById_Handler, - }, - { - MethodName: "QueryNullableFieldsTypeWithFilter", - Handler: _ProductService_QueryNullableFieldsTypeWithFilter_Handler, - }, - { - MethodName: "QueryAllNullableFieldsTypes", - Handler: _ProductService_QueryAllNullableFieldsTypes_Handler, - }, - { - MethodName: "MutationCreateNullableFieldsType", - Handler: _ProductService_MutationCreateNullableFieldsType_Handler, - }, - { - MethodName: "MutationUpdateNullableFieldsType", - Handler: _ProductService_MutationUpdateNullableFieldsType_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "product.proto", From 061153bafcf19a27c609ad95ee5365ff7fd8e82a Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 21 Jul 2025 16:39:37 +0200 Subject: [PATCH 02/16] feat: support for lists in response messages --- .../datasource/grpc_datasource/compiler.go | 21 +- .../grpc_datasource/compiler_test.go | 18 + .../grpc_datasource/execution_plan.go | 14 + .../execution_plan_composite_test.go | 896 ++++ .../execution_plan_federation_test.go | 326 ++ .../execution_plan_list_test.go | 185 + .../execution_plan_nullable_test.go | 645 +++ .../grpc_datasource/execution_plan_test.go | 3123 +++-------- .../grpc_datasource/execution_plan_visitor.go | 112 +- .../grpc_datasource/grpc_datasource.go | 95 +- .../grpc_datasource/grpc_datasource_test.go | 545 ++ .../grpc_datasource/mapping_test_helper.go | 291 ++ v2/pkg/grpctest/mapping/mapping.go | 280 +- v2/pkg/grpctest/mockservice.go | 642 +++ v2/pkg/grpctest/product.proto | 195 + v2/pkg/grpctest/productv1/product.pb.go | 4549 ++++++++++++----- v2/pkg/grpctest/productv1/product_grpc.pb.go | 456 ++ v2/pkg/grpctest/testdata/products.graphqls | 104 + 18 files changed, 8769 insertions(+), 3728 deletions(-) create mode 100644 v2/pkg/engine/datasource/grpc_datasource/execution_plan_composite_test.go create mode 100644 v2/pkg/engine/datasource/grpc_datasource/execution_plan_federation_test.go create mode 100644 v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go create mode 100644 v2/pkg/engine/datasource/grpc_datasource/execution_plan_nullable_test.go diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index 5726126399..7401698d8c 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -115,9 +115,10 @@ type Method struct { // Message represents a protobuf message type with its fields. type Message struct { - Name string // The name of the message - Fields []Field // The fields in the message - Desc protoref.MessageDescriptor // The protobuf descriptor for the message + Name string // The name of the message + Fields []Field // The fields in the message + Desc protoref.MessageDescriptor // The protobuf descriptor for the message + NestedMessages []Message // The nested messages in the message } // Field represents a field in a protobuf message. @@ -599,18 +600,24 @@ func (p *RPCCompiler) parseMethod(m protoref.MethodDescriptor) Method { // parseMessageDefinitions extracts information from a protobuf message descriptor. // It returns a slice of Message objects with the name and descriptor. func (p *RPCCompiler) parseMessageDefinitions(messages protoref.MessageDescriptors) []Message { - extractedMessage := make([]Message, 0, messages.Len()) + extractedMessages := make([]Message, 0, messages.Len()) for i := 0; i < messages.Len(); i++ { protoMessage := messages.Get(i) - extractedMessage = append(extractedMessage, Message{ + message := Message{ Name: string(protoMessage.Name()), Desc: protoMessage, - }) + } + + if protoMessage.Messages().Len() > 0 { + message.NestedMessages = p.parseMessageDefinitions(protoMessage.Messages()) + } + + extractedMessages = append(extractedMessages, message) } - return extractedMessage + return extractedMessages } // enrichMessageData enriches the message data with the field information. diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go b/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go index 5e098c3035..b35be50399 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go @@ -291,3 +291,21 @@ func TestBuildProtoMessage(t *testing.T) { require.Equal(t, 1, len(invocations)) } + +func TestCompileNestedLists(t *testing.T) { + compiler, err := NewProtoCompiler(grpctest.MustProtoSchema(t), testMapping()) + require.NoError(t, err) + + require.Equal(t, "productv1", compiler.doc.Package) + + listOfListOfString := compiler.doc.MessageByName("ListOfListOfString") + require.Equal(t, "ListOfListOfString", listOfListOfString.Name) + require.Equal(t, 1, len(listOfListOfString.Fields)) + require.Equal(t, "list", listOfListOfString.Fields[0].Name) + + message := compiler.doc.MessageByName("BlogPost") + require.Equal(t, "BlogPost", message.Name) + require.Equal(t, 2, len(message.Fields)) + require.Equal(t, "id", message.Fields[0].Name) + require.Equal(t, "tag_groups", message.Fields[1].Name) +} diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go index 839f3940f5..ef89c30ff7 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go @@ -171,11 +171,25 @@ type RPCField struct { StaticValue string // Optional indicates if the field is optional Optional bool + // IsListType indicates if the field is a list wrapper type + IsListType bool + // ListMetadata contains the metadata for the list type + ListMetadata *ListMetadata // Message represents the nested message type definition for complex fields. // This enables recursive construction of nested protobuf message structures. Message *RPCMessage } +type ListMetadata struct { + ItemTypeName string + NestingLevel int + LevelInfo []ListMetadataItem +} + +type ListMetadataItem struct { + Optional bool +} + // ToOptionalTypeMessage returns a message that wraps the scalar value in a message // as protobuf scalar types are not nullable. func (r *RPCField) ToOptionalTypeMessage(protoName string) *RPCMessage { diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_composite_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_composite_test.go new file mode 100644 index 0000000000..30ae95163e --- /dev/null +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_composite_test.go @@ -0,0 +1,896 @@ +package grpcdatasource + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "github.com/wundergraph/graphql-go-tools/v2/pkg/astparser" + "github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor" + grpctest "github.com/wundergraph/graphql-go-tools/v2/pkg/grpctest" +) + +func TestCompositeTypeExecutionPlan(t *testing.T) { + tests := []struct { + name string + query string + expectedPlan *RPCExecutionPlan + expectedError string + }{ + { + name: "Should create an execution plan for a query with a random cat", + query: "query RandomCatQuery { randomPet { id name kind ... on Cat { meowVolume } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryRandomPet", + Request: RPCMessage{ + Name: "QueryRandomPetRequest", + }, + Response: RPCMessage{ + Name: "QueryRandomPetResponse", + Fields: []RPCField{ + { + Name: "random_pet", + TypeName: string(DataTypeMessage), + JSONPath: "randomPet", + Message: &RPCMessage{ + Name: "Animal", + OneOfType: OneOfTypeInterface, + MemberTypes: []string{ + "Cat", + "Dog", + }, + FieldSelectionSet: RPCFieldSelectionSet{ + "Cat": { + { + Name: "meow_volume", + TypeName: string(DataTypeInt32), + JSONPath: "meowVolume", + }, + }, + }, + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeString), + JSONPath: "kind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a query with a random cat and dog", + query: "query CatAndDogQuery { randomPet { id name kind ... on Cat { meowVolume } ... on Dog { barkVolume } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryRandomPet", + Request: RPCMessage{ + Name: "QueryRandomPetRequest", + }, + Response: RPCMessage{ + Name: "QueryRandomPetResponse", + Fields: []RPCField{ + { + Name: "random_pet", + TypeName: string(DataTypeMessage), + JSONPath: "randomPet", + Message: &RPCMessage{ + Name: "Animal", + OneOfType: OneOfTypeInterface, + MemberTypes: []string{ + "Cat", + "Dog", + }, + FieldSelectionSet: RPCFieldSelectionSet{ + "Cat": { + { + Name: "meow_volume", + TypeName: string(DataTypeInt32), + JSONPath: "meowVolume", + }, + }, + "Dog": { + { + Name: "bark_volume", + TypeName: string(DataTypeInt32), + JSONPath: "barkVolume", + }, + }, + }, + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeString), + JSONPath: "kind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a query with all pets (interface list)", + query: "query AllPetsQuery { allPets { id name kind ... on Cat { meowVolume } ... on Dog { barkVolume } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryAllPets", + Request: RPCMessage{ + Name: "QueryAllPetsRequest", + }, + Response: RPCMessage{ + Name: "QueryAllPetsResponse", + Fields: []RPCField{ + { + Name: "all_pets", + TypeName: string(DataTypeMessage), + JSONPath: "allPets", + Repeated: true, + Message: &RPCMessage{ + Name: "Animal", + OneOfType: OneOfTypeInterface, + MemberTypes: []string{ + "Cat", + "Dog", + }, + FieldSelectionSet: RPCFieldSelectionSet{ + "Cat": { + { + Name: "meow_volume", + TypeName: string(DataTypeInt32), + JSONPath: "meowVolume", + }, + }, + "Dog": { + { + Name: "bark_volume", + TypeName: string(DataTypeInt32), + JSONPath: "barkVolume", + }, + }, + }, + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeString), + JSONPath: "kind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a query with all pets using an interface fragment", + query: "query AllPetsQuery { allPets { ... on Animal { id name kind } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryAllPets", + Request: RPCMessage{ + Name: "QueryAllPetsRequest", + }, + Response: RPCMessage{ + Name: "QueryAllPetsResponse", + Fields: []RPCField{ + { + Name: "all_pets", + TypeName: string(DataTypeMessage), + JSONPath: "allPets", + Repeated: true, + Message: &RPCMessage{ + Name: "Animal", + OneOfType: OneOfTypeInterface, + MemberTypes: []string{ + "Cat", + "Dog", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "Animal": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeString), + JSONPath: "kind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a query with interface selecting only common fields", + query: "query CommonFieldsQuery { randomPet { id name kind } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryRandomPet", + Request: RPCMessage{ + Name: "QueryRandomPetRequest", + }, + Response: RPCMessage{ + Name: "QueryRandomPetResponse", + Fields: []RPCField{ + { + Name: "random_pet", + TypeName: string(DataTypeMessage), + JSONPath: "randomPet", + Message: &RPCMessage{ + Name: "Animal", + OneOfType: OneOfTypeInterface, + MemberTypes: []string{ + "Cat", + "Dog", + }, + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeString), + JSONPath: "kind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a SearchResult union query", + query: "query SearchQuery($input: SearchInput!) { search(input: $input) { ... on Product { id name price } ... on User { id name } ... on Category { id name kind } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QuerySearch", + Request: RPCMessage{ + Name: "QuerySearchRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "SearchInput", + Fields: []RPCField{ + { + Name: "query", + TypeName: string(DataTypeString), + JSONPath: "query", + }, + { + Name: "limit", + TypeName: string(DataTypeInt32), + JSONPath: "limit", + Optional: true, + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "QuerySearchResponse", + Fields: []RPCField{ + { + Name: "search", + TypeName: string(DataTypeMessage), + JSONPath: "search", + Repeated: true, + Message: &RPCMessage{ + Name: "SearchResult", + OneOfType: OneOfTypeUnion, + MemberTypes: []string{ + "Product", + "User", + "Category", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "Product": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "price", + TypeName: string(DataTypeDouble), + JSONPath: "price", + }, + }, + "User": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + }, + "Category": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a single SearchResult union query", + query: "query RandomSearchQuery { randomSearchResult { ... on Product { id name price } ... on User { id name } ... on Category { id name kind } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryRandomSearchResult", + Request: RPCMessage{ + Name: "QueryRandomSearchResultRequest", + }, + Response: RPCMessage{ + Name: "QueryRandomSearchResultResponse", + Fields: []RPCField{ + { + Name: "random_search_result", + TypeName: string(DataTypeMessage), + JSONPath: "randomSearchResult", + Message: &RPCMessage{ + Name: "SearchResult", + OneOfType: OneOfTypeUnion, + MemberTypes: []string{ + "Product", + "User", + "Category", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "Product": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "price", + TypeName: string(DataTypeDouble), + JSONPath: "price", + }, + }, + "User": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + }, + "Category": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a SearchResult union with partial selection", + query: "query PartialSearchQuery($input: SearchInput!) { search(input: $input) { ... on Product { id name } ... on User { id name } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QuerySearch", + Request: RPCMessage{ + Name: "QuerySearchRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "SearchInput", + Fields: []RPCField{ + { + Name: "query", + TypeName: string(DataTypeString), + JSONPath: "query", + }, + { + Name: "limit", + TypeName: string(DataTypeInt32), + JSONPath: "limit", + Optional: true, + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "QuerySearchResponse", + Fields: []RPCField{ + { + Name: "search", + TypeName: string(DataTypeMessage), + JSONPath: "search", + Repeated: true, + Message: &RPCMessage{ + Name: "SearchResult", + OneOfType: OneOfTypeUnion, + MemberTypes: []string{ + "Product", + "User", + "Category", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "Product": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + }, + "User": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + // Parse the GraphQL schema + schemaDoc := grpctest.MustGraphQLSchema(t) + + // Parse the GraphQL query + queryDoc, report := astparser.ParseGraphqlDocumentString(tt.query) + if report.HasErrors() { + t.Fatalf("failed to parse query: %s", report.Error()) + } + + walker := astvisitor.NewWalker(48) + + rpcPlanVisitor := newRPCPlanVisitor(&walker, rpcPlanVisitorConfig{ + subgraphName: "Products", + mapping: testMapping(), + }) + + walker.Walk(&queryDoc, &schemaDoc, &report) + + if report.HasErrors() { + require.NotEmpty(t, tt.expectedError) + require.Contains(t, report.Error(), tt.expectedError) + return + } + + require.Empty(t, tt.expectedError) + diff := cmp.Diff(tt.expectedPlan, rpcPlanVisitor.plan) + if diff != "" { + t.Fatalf("execution plan mismatch: %s", diff) + } + }) + } +} + +func TestMutationUnionExecutionPlan(t *testing.T) { + tests := []struct { + name string + query string + expectedPlan *RPCExecutionPlan + expectedError string + }{ + { + name: "Should create an execution plan for ActionResult union mutation", + query: "mutation PerformActionMutation($input: ActionInput!) { performAction(input: $input) { ... on ActionSuccess { message timestamp } ... on ActionError { message code } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "MutationPerformAction", + Request: RPCMessage{ + Name: "MutationPerformActionRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "ActionInput", + Fields: []RPCField{ + { + Name: "type", + TypeName: string(DataTypeString), + JSONPath: "type", + }, + { + Name: "payload", + TypeName: string(DataTypeString), + JSONPath: "payload", + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "MutationPerformActionResponse", + Fields: []RPCField{ + { + Name: "perform_action", + TypeName: string(DataTypeMessage), + JSONPath: "performAction", + Message: &RPCMessage{ + Name: "ActionResult", + OneOfType: OneOfTypeUnion, + MemberTypes: []string{ + "ActionSuccess", + "ActionError", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "ActionSuccess": { + { + Name: "message", + TypeName: string(DataTypeString), + JSONPath: "message", + }, + { + Name: "timestamp", + TypeName: string(DataTypeString), + JSONPath: "timestamp", + }, + }, + "ActionError": { + { + Name: "message", + TypeName: string(DataTypeString), + JSONPath: "message", + }, + { + Name: "code", + TypeName: string(DataTypeString), + JSONPath: "code", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for ActionResult union with only success case", + query: "mutation PerformSuccessActionMutation($input: ActionInput!) { performAction(input: $input) { ... on ActionSuccess { message timestamp } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "MutationPerformAction", + Request: RPCMessage{ + Name: "MutationPerformActionRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "ActionInput", + Fields: []RPCField{ + { + Name: "type", + TypeName: string(DataTypeString), + JSONPath: "type", + }, + { + Name: "payload", + TypeName: string(DataTypeString), + JSONPath: "payload", + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "MutationPerformActionResponse", + Fields: []RPCField{ + { + Name: "perform_action", + TypeName: string(DataTypeMessage), + JSONPath: "performAction", + Message: &RPCMessage{ + Name: "ActionResult", + OneOfType: OneOfTypeUnion, + MemberTypes: []string{ + "ActionSuccess", + "ActionError", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "ActionSuccess": { + { + Name: "message", + TypeName: string(DataTypeString), + JSONPath: "message", + }, + { + Name: "timestamp", + TypeName: string(DataTypeString), + JSONPath: "timestamp", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for ActionResult union with only error case", + query: "mutation PerformErrorActionMutation($input: ActionInput!) { performAction(input: $input) { ... on ActionError { message code } } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "MutationPerformAction", + Request: RPCMessage{ + Name: "MutationPerformActionRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "ActionInput", + Fields: []RPCField{ + { + Name: "type", + TypeName: string(DataTypeString), + JSONPath: "type", + }, + { + Name: "payload", + TypeName: string(DataTypeString), + JSONPath: "payload", + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "MutationPerformActionResponse", + Fields: []RPCField{ + { + Name: "perform_action", + TypeName: string(DataTypeMessage), + JSONPath: "performAction", + Message: &RPCMessage{ + Name: "ActionResult", + OneOfType: OneOfTypeUnion, + MemberTypes: []string{ + "ActionSuccess", + "ActionError", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "ActionError": { + { + Name: "message", + TypeName: string(DataTypeString), + JSONPath: "message", + }, + { + Name: "code", + TypeName: string(DataTypeString), + JSONPath: "code", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + // Parse the GraphQL schema + schemaDoc := grpctest.MustGraphQLSchema(t) + + // Parse the GraphQL query + queryDoc, report := astparser.ParseGraphqlDocumentString(tt.query) + if report.HasErrors() { + t.Fatalf("failed to parse query: %s", report.Error()) + } + + walker := astvisitor.NewWalker(48) + + rpcPlanVisitor := newRPCPlanVisitor(&walker, rpcPlanVisitorConfig{ + subgraphName: "Products", + mapping: testMapping(), + }) + + walker.Walk(&queryDoc, &schemaDoc, &report) + + if report.HasErrors() { + require.NotEmpty(t, tt.expectedError) + require.Contains(t, report.Error(), tt.expectedError) + return + } + + require.Empty(t, tt.expectedError) + diff := cmp.Diff(tt.expectedPlan, rpcPlanVisitor.plan) + if diff != "" { + t.Fatalf("execution plan mismatch: %s", diff) + } + }) + } +} diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_federation_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_federation_test.go new file mode 100644 index 0000000000..5756d9d167 --- /dev/null +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_federation_test.go @@ -0,0 +1,326 @@ +package grpcdatasource + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/wundergraph/graphql-go-tools/v2/pkg/astparser" + "github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor" + grpctest "github.com/wundergraph/graphql-go-tools/v2/pkg/grpctest" +) + +func TestEntityLookup(t *testing.T) { + tests := []struct { + name string + query string + expectedPlan *RPCExecutionPlan + mapping *GRPCMapping + }{ + { + name: "Should create an execution plan for an entity lookup with one key field", + query: `query EntityLookup($representations: [_Any!]!) { _entities(representations: $representations) { ... on Product { __typename id name price } } }`, + mapping: &GRPCMapping{ + Service: "Products", + EntityRPCs: map[string]EntityRPCConfig{ + "Product": { + Key: "id", + RPCConfig: RPCConfig{ + RPC: "LookupProductById", + Request: "LookupProductByIdRequest", + Response: "LookupProductByIdResponse", + }, + }, + }, + }, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "LookupProductById", + // Define the structure of the request message + Request: RPCMessage{ + Name: "LookupProductByIdRequest", + Fields: []RPCField{ + { + Name: "keys", + TypeName: string(DataTypeMessage), + Repeated: true, + JSONPath: "representations", + Message: &RPCMessage{ + Name: "LookupProductByIdKey", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + }, + }, + }, + }, + }, + // Define the structure of the response message + Response: RPCMessage{ + Name: "LookupProductByIdResponse", + Fields: []RPCField{ + { + Name: "result", + TypeName: string(DataTypeMessage), + Repeated: true, + JSONPath: "_entities", + Message: &RPCMessage{ + Name: "Product", + Fields: []RPCField{ + { + Name: "__typename", + TypeName: string(DataTypeString), + JSONPath: "__typename", + StaticValue: "Product", + }, + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "price", + TypeName: string(DataTypeDouble), + JSONPath: "price", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + + // TODO implement multiple entity lookup types + // { + // name: "Should create an execution plan for an entity lookup multiple types", + // query: ` + // query EntityLookup($representations: [_Any!]!) { + // _entities(representations: $representations) { + // ... on Product { + // id + // name + // price + // } + // ... on Storage { + // id + // name + // location + // } + // } + // } + // `, + // expectedPlan: &RPCExecutionPlan{ + // Groups: []RPCCallGroup{ + // { + // Calls: []RPCCall{ + // { + // ServiceName: "Products", + // MethodName: "LookupProductById", + // // Define the structure of the request message + // Request: RPCMessage{ + // Name: "LookupProductByIdRequest", + // Fields: []RPCField{ + // { + // Name: "inputs", + // TypeName: string(DataTypeMessage), + // Repeated: true, + // JSONPath: "representations", // Path to extract data from GraphQL variables + // + + // Message: &RPCMessage{ + // Name: "LookupProductByIdInput", + // Fields: []RPCField{ + // { + // Name: "key", + // TypeName: string(DataTypeMessage), + // + + // Message: &RPCMessage{ + // Name: "ProductByIdKey", + // Fields: []RPCField{ + // { + // Name: "id", + // TypeName: string(DataTypeString), + // JSONPath: "id", // Extract 'id' from each representation + // + + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // // Define the structure of the response message + // Response: RPCMessage{ + // Name: "LookupProductByIdResponse", + // Fields: []RPCField{ + // { + // Name: "results", + // TypeName: string(DataTypeMessage), + // Repeated: true, + // + + // JSONPath: "results", + // Message: &RPCMessage{ + // Name: "LookupProductByIdResult", + // Fields: []RPCField{ + // { + // Name: "product", + // TypeName: string(DataTypeMessage), + // + + // Message: &RPCMessage{ + // Name: "Product", + // Fields: []RPCField{ + // { + // Name: "id", + // TypeName: string(DataTypeString), + // JSONPath: "id", + // }, + // { + // Name: "name", + // TypeName: string(DataTypeString), + // JSONPath: "name", + // }, + // { + // Name: "price", + // TypeName: string(DataTypeFloat), + // JSONPath: "price", + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // { + // ServiceName: "Products", + // MethodName: "LookupStorageById", + // Request: RPCMessage{ + // Name: "LookupStorageByIdRequest", + // Fields: []RPCField{ + // { + // Name: "inputs", + // TypeName: string(DataTypeMessage), + // Repeated: true, + // JSONPath: "representations", + // Message: &RPCMessage{ + // Name: "LookupStorageByIdInput", + // Fields: []RPCField{ + // { + // Name: "key", + // TypeName: string(DataTypeMessage), + // Message: &RPCMessage{ + // Name: "StorageByIdKey", + // Fields: []RPCField{ + // { + // Name: "id", + // TypeName: string(DataTypeString), + // JSONPath: "id", + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // Response: RPCMessage{ + // Name: "LookupStorageByIdResponse", + // Fields: []RPCField{ + // { + // Name: "results", + // TypeName: string(DataTypeMessage), + // Repeated: true, + // JSONPath: "results", + // Message: &RPCMessage{ + // Name: "LookupStorageByIdResult", + // Fields: []RPCField{ + // { + // Name: "storage", + // TypeName: string(DataTypeMessage), + // Message: &RPCMessage{ + // Name: "Storage", + // Fields: []RPCField{ + // { + // Name: "id", + // TypeName: string(DataTypeString), + // JSONPath: "id", + // }, + // { + // Name: "name", + // TypeName: string(DataTypeString), + // JSONPath: "name", + // }, + // { + // Name: "location", + // TypeName: string(DataTypeString), + // JSONPath: "location", + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + // Parse the GraphQL schema + schemaDoc := grpctest.MustGraphQLSchema(t) + + // Parse the GraphQL query + queryDoc, report := astparser.ParseGraphqlDocumentString(tt.query) + if report.HasErrors() { + t.Fatalf("failed to parse query: %s", report.Error()) + } + + walker := astvisitor.NewWalker(48) + + rpcPlanVisitor := newRPCPlanVisitor(&walker, rpcPlanVisitorConfig{ + subgraphName: "Products", + mapping: tt.mapping, + }) + + walker.Walk(&queryDoc, &schemaDoc, &report) + + if report.HasErrors() { + t.Fatalf("failed to walk AST: %s", report.Error()) + } + + diff := cmp.Diff(tt.expectedPlan, rpcPlanVisitor.plan) + if diff != "" { + t.Fatalf("execution plan mismatch: %s", diff) + } + }) + } +} diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go new file mode 100644 index 0000000000..7e85f04c8e --- /dev/null +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go @@ -0,0 +1,185 @@ +package grpcdatasource + +import "testing" + +func TestListExecutionPlan(t *testing.T) { + tests := []struct { + name string + query string + expectedPlan *RPCExecutionPlan + expectedError string + }{ + { + name: "Should create an execution plan for a blog post with a non-nullable list", + query: `query GetBlogPost { blogPost { title tags } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryBlogPost", + Request: RPCMessage{ + Name: "QueryBlogPostRequest", + }, + Response: RPCMessage{ + Name: "QueryBlogPostResponse", + Fields: RPCFields{ + { + Name: "blog_post", + TypeName: string(DataTypeMessage), + JSONPath: "blogPost", + Message: &RPCMessage{ + Name: "BlogPost", + Fields: RPCFields{ + { + Name: "title", + TypeName: string(DataTypeString), + JSONPath: "title", + }, + { + Name: "tags", + TypeName: string(DataTypeString), + Repeated: true, + JSONPath: "tags", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a blog post with a nullable list", + query: `query GetBlogPost { blogPost { title optionalTags } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryBlogPost", + Request: RPCMessage{ + Name: "QueryBlogPostRequest", + }, + Response: RPCMessage{ + Name: "QueryBlogPostResponse", + Fields: RPCFields{ + { + Name: "blog_post", + TypeName: string(DataTypeMessage), + JSONPath: "blogPost", + Message: &RPCMessage{ + Name: "BlogPost", + Fields: RPCFields{ + { + Name: "title", + TypeName: string(DataTypeString), + JSONPath: "title", + }, + { + Name: "optional_tags", + TypeName: string(DataTypeMessage), + Optional: true, + Message: &RPCMessage{ + Name: "ListOfString", + Fields: RPCFields{ + { + Name: "items", + TypeName: string(DataTypeString), + Repeated: true, + JSONPath: "optionalTags", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a blog post with a nested list", + query: `query GetBlogPost { blogPost { tagGroups } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryBlogPost", + Request: RPCMessage{ + Name: "QueryBlogPostRequest", + }, + Response: RPCMessage{ + Name: "QueryBlogPostResponse", + Fields: RPCFields{ + { + Name: "blog_post", + TypeName: string(DataTypeMessage), + JSONPath: "blogPost", + Message: &RPCMessage{ + Name: "BlogPost", + Fields: RPCFields{ + { + Name: "tag_groups", + TypeName: string(DataTypeMessage), + Repeated: false, + JSONPath: "", + Message: &RPCMessage{ + Name: "ListOfListOfString", + Fields: RPCFields{ + { + Name: "list", + TypeName: string(DataTypeMessage), + Repeated: false, + JSONPath: "", + Message: &RPCMessage{ + Name: "List", + Fields: RPCFields{ + { + Name: "items", + TypeName: string(DataTypeMessage), + Repeated: true, + JSONPath: "", + Message: &RPCMessage{ + Name: "ListOfString", + Fields: RPCFields{ + { + Name: "items", + TypeName: string(DataTypeString), + Repeated: true, + JSONPath: "tagGroups", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + runTest(t, testCase{ + query: tt.query, + expectedPlan: tt.expectedPlan, + expectedError: tt.expectedError, + }) + }) + } +} diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_nullable_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_nullable_test.go new file mode 100644 index 0000000000..14eb1218e0 --- /dev/null +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_nullable_test.go @@ -0,0 +1,645 @@ +package grpcdatasource + +import ( + "testing" +) + +func TestNullableFieldsExecutionPlan(t *testing.T) { + tests := []struct { + name string + query string + expectedPlan *RPCExecutionPlan + expectedError string + }{ + { + name: "Should create an execution plan for a query with nullable fields type", + query: "query NullableFieldsTypeQuery { nullableFieldsType { id name optionalString optionalInt optionalFloat optionalBoolean requiredString requiredInt } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryNullableFieldsType", + Request: RPCMessage{ + Name: "QueryNullableFieldsTypeRequest", + }, + Response: RPCMessage{ + Name: "QueryNullableFieldsTypeResponse", + Fields: []RPCField{ + { + Name: "nullable_fields_type", + TypeName: string(DataTypeMessage), + JSONPath: "nullableFieldsType", + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "optional_int", + TypeName: string(DataTypeInt32), + JSONPath: "optionalInt", + Optional: true, + }, + { + Name: "optional_float", + TypeName: string(DataTypeDouble), + JSONPath: "optionalFloat", + Optional: true, + }, + { + Name: "optional_boolean", + TypeName: string(DataTypeBool), + JSONPath: "optionalBoolean", + Optional: true, + }, + { + Name: "required_string", + TypeName: string(DataTypeString), + JSONPath: "requiredString", + }, + { + Name: "required_int", + TypeName: string(DataTypeInt32), + JSONPath: "requiredInt", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a query with nullable fields in the request", + query: `query NullableFieldsTypeWithFilterQuery($filter: NullableFieldsFilter!) { nullableFieldsTypeWithFilter(filter: $filter) { id name optionalString optionalInt optionalFloat optionalBoolean } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryNullableFieldsTypeWithFilter", + Request: RPCMessage{ + Name: "QueryNullableFieldsTypeWithFilterRequest", + Fields: []RPCField{ + { + Name: "filter", + TypeName: string(DataTypeMessage), + JSONPath: "filter", + Message: &RPCMessage{ + Name: "NullableFieldsFilter", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Optional: true, + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "include_nulls", + TypeName: string(DataTypeBool), + JSONPath: "includeNulls", + Optional: true, + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "QueryNullableFieldsTypeWithFilterResponse", + Fields: []RPCField{ + { + Name: "nullable_fields_type_with_filter", + TypeName: string(DataTypeMessage), + JSONPath: "nullableFieldsTypeWithFilter", + Repeated: true, + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "optional_int", + TypeName: string(DataTypeInt32), + JSONPath: "optionalInt", + Optional: true, + }, + { + Name: "optional_float", + TypeName: string(DataTypeDouble), + JSONPath: "optionalFloat", + Optional: true, + }, + { + Name: "optional_boolean", + TypeName: string(DataTypeBool), + JSONPath: "optionalBoolean", + Optional: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for nullable fields type by ID query", + query: `query NullableFieldsTypeByIdQuery($id: ID!) { nullableFieldsTypeById(id: $id) { id name optionalString requiredString } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryNullableFieldsTypeById", + Request: RPCMessage{ + Name: "QueryNullableFieldsTypeByIdRequest", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + }, + }, + Response: RPCMessage{ + Name: "QueryNullableFieldsTypeByIdResponse", + Fields: []RPCField{ + { + Name: "nullable_fields_type_by_id", + TypeName: string(DataTypeMessage), + JSONPath: "nullableFieldsTypeById", + Optional: true, + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "required_string", + TypeName: string(DataTypeString), + JSONPath: "requiredString", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for all nullable fields types query", + query: "query AllNullableFieldsTypesQuery { allNullableFieldsTypes { id name optionalString optionalInt requiredString requiredInt } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryAllNullableFieldsTypes", + Request: RPCMessage{ + Name: "QueryAllNullableFieldsTypesRequest", + }, + Response: RPCMessage{ + Name: "QueryAllNullableFieldsTypesResponse", + Fields: []RPCField{ + { + Name: "all_nullable_fields_types", + TypeName: string(DataTypeMessage), + JSONPath: "allNullableFieldsTypes", + Repeated: true, + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "optional_int", + TypeName: string(DataTypeInt32), + JSONPath: "optionalInt", + Optional: true, + }, + { + Name: "required_string", + TypeName: string(DataTypeString), + JSONPath: "requiredString", + }, + { + Name: "required_int", + TypeName: string(DataTypeInt32), + JSONPath: "requiredInt", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for create nullable fields type mutation", + query: `mutation CreateNullableFieldsType($input: NullableFieldsInput!) { createNullableFieldsType(input: $input) { id name optionalString optionalInt optionalFloat optionalBoolean requiredString requiredInt } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "MutationCreateNullableFieldsType", + Request: RPCMessage{ + Name: "MutationCreateNullableFieldsTypeRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "NullableFieldsInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "optional_int", + TypeName: string(DataTypeInt32), + JSONPath: "optionalInt", + Optional: true, + }, + { + Name: "optional_float", + TypeName: string(DataTypeDouble), + JSONPath: "optionalFloat", + Optional: true, + }, + { + Name: "optional_boolean", + TypeName: string(DataTypeBool), + JSONPath: "optionalBoolean", + Optional: true, + }, + { + Name: "required_string", + TypeName: string(DataTypeString), + JSONPath: "requiredString", + }, + { + Name: "required_int", + TypeName: string(DataTypeInt32), + JSONPath: "requiredInt", + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "MutationCreateNullableFieldsTypeResponse", + Fields: []RPCField{ + { + Name: "create_nullable_fields_type", + TypeName: string(DataTypeMessage), + JSONPath: "createNullableFieldsType", + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "optional_int", + TypeName: string(DataTypeInt32), + JSONPath: "optionalInt", + Optional: true, + }, + { + Name: "optional_float", + TypeName: string(DataTypeDouble), + JSONPath: "optionalFloat", + Optional: true, + }, + { + Name: "optional_boolean", + TypeName: string(DataTypeBool), + JSONPath: "optionalBoolean", + Optional: true, + }, + { + Name: "required_string", + TypeName: string(DataTypeString), + JSONPath: "requiredString", + }, + { + Name: "required_int", + TypeName: string(DataTypeInt32), + JSONPath: "requiredInt", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for update nullable fields type mutation", + query: `mutation UpdateNullableFieldsType($id: ID!, $input: NullableFieldsInput!) { updateNullableFieldsType(id: $id, input: $input) { id name optionalString requiredString } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "MutationUpdateNullableFieldsType", + Request: RPCMessage{ + Name: "MutationUpdateNullableFieldsTypeRequest", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "NullableFieldsInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "optional_int", + TypeName: string(DataTypeInt32), + JSONPath: "optionalInt", + Optional: true, + }, + { + Name: "optional_float", + TypeName: string(DataTypeDouble), + JSONPath: "optionalFloat", + Optional: true, + }, + { + Name: "optional_boolean", + TypeName: string(DataTypeBool), + JSONPath: "optionalBoolean", + Optional: true, + }, + { + Name: "required_string", + TypeName: string(DataTypeString), + JSONPath: "requiredString", + }, + { + Name: "required_int", + TypeName: string(DataTypeInt32), + JSONPath: "requiredInt", + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "MutationUpdateNullableFieldsTypeResponse", + Fields: []RPCField{ + { + Name: "update_nullable_fields_type", + TypeName: string(DataTypeMessage), + JSONPath: "updateNullableFieldsType", + Optional: true, + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "required_string", + TypeName: string(DataTypeString), + JSONPath: "requiredString", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for nullable fields with partial field selection", + query: "query PartialNullableFieldsQuery { nullableFieldsType { id optionalString } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryNullableFieldsType", + Request: RPCMessage{ + Name: "QueryNullableFieldsTypeRequest", + }, + Response: RPCMessage{ + Name: "QueryNullableFieldsTypeResponse", + Fields: []RPCField{ + { + Name: "nullable_fields_type", + TypeName: string(DataTypeMessage), + JSONPath: "nullableFieldsType", + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for nullable fields with only optional fields", + query: "query OptionalFieldsOnlyQuery { nullableFieldsType { optionalString optionalInt optionalFloat optionalBoolean } }", + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryNullableFieldsType", + Request: RPCMessage{ + Name: "QueryNullableFieldsTypeRequest", + }, + Response: RPCMessage{ + Name: "QueryNullableFieldsTypeResponse", + Fields: []RPCField{ + { + Name: "nullable_fields_type", + TypeName: string(DataTypeMessage), + JSONPath: "nullableFieldsType", + Message: &RPCMessage{ + Name: "NullableFieldsType", + Fields: []RPCField{ + { + Name: "optional_string", + TypeName: string(DataTypeString), + JSONPath: "optionalString", + Optional: true, + }, + { + Name: "optional_int", + TypeName: string(DataTypeInt32), + JSONPath: "optionalInt", + Optional: true, + }, + { + Name: "optional_float", + TypeName: string(DataTypeDouble), + JSONPath: "optionalFloat", + Optional: true, + }, + { + Name: "optional_boolean", + TypeName: string(DataTypeBool), + JSONPath: "optionalBoolean", + Optional: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + runTest(t, testCase{ + query: tt.query, + expectedPlan: tt.expectedPlan, + expectedError: tt.expectedError, + }) + }) + } +} diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go index 6cbd29da5a..d9837e0b12 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go @@ -52,322 +52,6 @@ func runTest(t *testing.T, testCase testCase) { } } -func TestEntityLookup(t *testing.T) { - tests := []struct { - name string - query string - expectedPlan *RPCExecutionPlan - mapping *GRPCMapping - }{ - { - name: "Should create an execution plan for an entity lookup with one key field", - query: `query EntityLookup($representations: [_Any!]!) { _entities(representations: $representations) { ... on Product { __typename id name price } } }`, - mapping: &GRPCMapping{ - Service: "Products", - EntityRPCs: map[string]EntityRPCConfig{ - "Product": { - Key: "id", - RPCConfig: RPCConfig{ - RPC: "LookupProductById", - Request: "LookupProductByIdRequest", - Response: "LookupProductByIdResponse", - }, - }, - }, - }, - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "LookupProductById", - // Define the structure of the request message - Request: RPCMessage{ - Name: "LookupProductByIdRequest", - Fields: []RPCField{ - { - Name: "keys", - TypeName: string(DataTypeMessage), - Repeated: true, - JSONPath: "representations", - Message: &RPCMessage{ - Name: "LookupProductByIdKey", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - }, - }, - }, - }, - }, - // Define the structure of the response message - Response: RPCMessage{ - Name: "LookupProductByIdResponse", - Fields: []RPCField{ - { - Name: "result", - TypeName: string(DataTypeMessage), - Repeated: true, - JSONPath: "_entities", - Message: &RPCMessage{ - Name: "Product", - Fields: []RPCField{ - { - Name: "__typename", - TypeName: string(DataTypeString), - JSONPath: "__typename", - StaticValue: "Product", - }, - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "price", - TypeName: string(DataTypeDouble), - JSONPath: "price", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - - // TODO implement multiple entity lookup types - // { - // name: "Should create an execution plan for an entity lookup multiple types", - // query: ` - // query EntityLookup($representations: [_Any!]!) { - // _entities(representations: $representations) { - // ... on Product { - // id - // name - // price - // } - // ... on Storage { - // id - // name - // location - // } - // } - // } - // `, - // expectedPlan: &RPCExecutionPlan{ - // Groups: []RPCCallGroup{ - // { - // Calls: []RPCCall{ - // { - // ServiceName: "Products", - // MethodName: "LookupProductById", - // // Define the structure of the request message - // Request: RPCMessage{ - // Name: "LookupProductByIdRequest", - // Fields: []RPCField{ - // { - // Name: "inputs", - // TypeName: string(DataTypeMessage), - // Repeated: true, - // JSONPath: "representations", // Path to extract data from GraphQL variables - // - - // Message: &RPCMessage{ - // Name: "LookupProductByIdInput", - // Fields: []RPCField{ - // { - // Name: "key", - // TypeName: string(DataTypeMessage), - // - - // Message: &RPCMessage{ - // Name: "ProductByIdKey", - // Fields: []RPCField{ - // { - // Name: "id", - // TypeName: string(DataTypeString), - // JSONPath: "id", // Extract 'id' from each representation - // - - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // // Define the structure of the response message - // Response: RPCMessage{ - // Name: "LookupProductByIdResponse", - // Fields: []RPCField{ - // { - // Name: "results", - // TypeName: string(DataTypeMessage), - // Repeated: true, - // - - // JSONPath: "results", - // Message: &RPCMessage{ - // Name: "LookupProductByIdResult", - // Fields: []RPCField{ - // { - // Name: "product", - // TypeName: string(DataTypeMessage), - // - - // Message: &RPCMessage{ - // Name: "Product", - // Fields: []RPCField{ - // { - // Name: "id", - // TypeName: string(DataTypeString), - // JSONPath: "id", - // }, - // { - // Name: "name", - // TypeName: string(DataTypeString), - // JSONPath: "name", - // }, - // { - // Name: "price", - // TypeName: string(DataTypeFloat), - // JSONPath: "price", - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // { - // ServiceName: "Products", - // MethodName: "LookupStorageById", - // Request: RPCMessage{ - // Name: "LookupStorageByIdRequest", - // Fields: []RPCField{ - // { - // Name: "inputs", - // TypeName: string(DataTypeMessage), - // Repeated: true, - // JSONPath: "representations", - // Message: &RPCMessage{ - // Name: "LookupStorageByIdInput", - // Fields: []RPCField{ - // { - // Name: "key", - // TypeName: string(DataTypeMessage), - // Message: &RPCMessage{ - // Name: "StorageByIdKey", - // Fields: []RPCField{ - // { - // Name: "id", - // TypeName: string(DataTypeString), - // JSONPath: "id", - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // Response: RPCMessage{ - // Name: "LookupStorageByIdResponse", - // Fields: []RPCField{ - // { - // Name: "results", - // TypeName: string(DataTypeMessage), - // Repeated: true, - // JSONPath: "results", - // Message: &RPCMessage{ - // Name: "LookupStorageByIdResult", - // Fields: []RPCField{ - // { - // Name: "storage", - // TypeName: string(DataTypeMessage), - // Message: &RPCMessage{ - // Name: "Storage", - // Fields: []RPCField{ - // { - // Name: "id", - // TypeName: string(DataTypeString), - // JSONPath: "id", - // }, - // { - // Name: "name", - // TypeName: string(DataTypeString), - // JSONPath: "name", - // }, - // { - // Name: "location", - // TypeName: string(DataTypeString), - // JSONPath: "location", - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - // }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - // Parse the GraphQL schema - schemaDoc := grpctest.MustGraphQLSchema(t) - - // Parse the GraphQL query - queryDoc, report := astparser.ParseGraphqlDocumentString(tt.query) - if report.HasErrors() { - t.Fatalf("failed to parse query: %s", report.Error()) - } - - walker := astvisitor.NewWalker(48) - - rpcPlanVisitor := newRPCPlanVisitor(&walker, rpcPlanVisitorConfig{ - subgraphName: "Products", - mapping: tt.mapping, - }) - - walker.Walk(&queryDoc, &schemaDoc, &report) - - if report.HasErrors() { - t.Fatalf("failed to walk AST: %s", report.Error()) - } - - diff := cmp.Diff(tt.expectedPlan, rpcPlanVisitor.plan) - if diff != "" { - t.Fatalf("execution plan mismatch: %s", diff) - } - }) - } -} - func TestQueryExecutionPlans(t *testing.T) { tests := []struct { name string @@ -1425,7 +1109,7 @@ func TestQueryExecutionPlans(t *testing.T) { } } -func TestCompositeTypeExecutionPlan(t *testing.T) { +func TestProductExecutionPlan(t *testing.T) { tests := []struct { name string query string @@ -1433,105 +1117,34 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { expectedError string }{ { - name: "Should create an execution plan for a query with a random cat", - query: "query RandomCatQuery { randomPet { id name kind ... on Cat { meowVolume } } }", + name: "Should create an execution plan for a query with categories by kind", + query: "query CategoriesQuery($kind: CategoryKind!) { categoriesByKind(kind: $kind) { id name kind } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryRandomPet", + MethodName: "QueryCategoriesByKind", Request: RPCMessage{ - Name: "QueryRandomPetRequest", - }, - Response: RPCMessage{ - Name: "QueryRandomPetResponse", + Name: "QueryCategoriesByKindRequest", Fields: []RPCField{ { - Name: "random_pet", - TypeName: string(DataTypeMessage), - JSONPath: "randomPet", - Message: &RPCMessage{ - Name: "Animal", - OneOfType: OneOfTypeInterface, - MemberTypes: []string{ - "Cat", - "Dog", - }, - FieldSelectionSet: RPCFieldSelectionSet{ - "Cat": { - { - Name: "meow_volume", - TypeName: string(DataTypeInt32), - JSONPath: "meowVolume", - }, - }, - }, - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeString), - JSONPath: "kind", - }, - }, - }, + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", }, }, }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with a random cat and dog", - query: "query CatAndDogQuery { randomPet { id name kind ... on Cat { meowVolume } ... on Dog { barkVolume } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryRandomPet", - Request: RPCMessage{ - Name: "QueryRandomPetRequest", - }, Response: RPCMessage{ - Name: "QueryRandomPetResponse", + Name: "QueryCategoriesByKindResponse", Fields: []RPCField{ { - Name: "random_pet", + Name: "categories_by_kind", TypeName: string(DataTypeMessage), - JSONPath: "randomPet", + JSONPath: "categoriesByKind", + Repeated: true, Message: &RPCMessage{ - Name: "Animal", - OneOfType: OneOfTypeInterface, - MemberTypes: []string{ - "Cat", - "Dog", - }, - FieldSelectionSet: RPCFieldSelectionSet{ - "Cat": { - { - Name: "meow_volume", - TypeName: string(DataTypeInt32), - JSONPath: "meowVolume", - }, - }, - "Dog": { - { - Name: "bark_volume", - TypeName: string(DataTypeInt32), - JSONPath: "barkVolume", - }, - }, - }, + Name: "Category", Fields: []RPCField{ { Name: "id", @@ -1545,8 +1158,9 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, { Name: "kind", - TypeName: string(DataTypeString), + TypeName: string(DataTypeEnum), JSONPath: "kind", + EnumName: "CategoryKind", }, }, }, @@ -1558,47 +1172,35 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for a query with all pets (interface list)", - query: "query AllPetsQuery { allPets { id name kind ... on Cat { meowVolume } ... on Dog { barkVolume } } }", + name: "Should create an execution plan for a query with categories by kinds", + query: "query CategoriesQuery($kinds: [CategoryKind!]!) { categoriesByKinds(kinds: $kinds) { id name kind } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryAllPets", + MethodName: "QueryCategoriesByKinds", Request: RPCMessage{ - Name: "QueryAllPetsRequest", + Name: "QueryCategoriesByKindsRequest", + Fields: []RPCField{ + { + Name: "kinds", + TypeName: string(DataTypeEnum), + JSONPath: "kinds", + EnumName: "CategoryKind", + Repeated: true, + }, + }, }, Response: RPCMessage{ - Name: "QueryAllPetsResponse", + Name: "QueryCategoriesByKindsResponse", Fields: []RPCField{ { - Name: "all_pets", + Name: "categories_by_kinds", TypeName: string(DataTypeMessage), - JSONPath: "allPets", + JSONPath: "categoriesByKinds", Repeated: true, Message: &RPCMessage{ - Name: "Animal", - OneOfType: OneOfTypeInterface, - MemberTypes: []string{ - "Cat", - "Dog", - }, - FieldSelectionSet: RPCFieldSelectionSet{ - "Cat": { - { - Name: "meow_volume", - TypeName: string(DataTypeInt32), - JSONPath: "meowVolume", - }, - }, - "Dog": { - { - Name: "bark_volume", - TypeName: string(DataTypeInt32), - JSONPath: "barkVolume", - }, - }, - }, + Name: "Category", Fields: []RPCField{ { Name: "id", @@ -1612,8 +1214,9 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, { Name: "kind", - TypeName: string(DataTypeString), + TypeName: string(DataTypeEnum), JSONPath: "kind", + EnumName: "CategoryKind", }, }, }, @@ -1625,48 +1228,47 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for a query with all pets using an interface fragment", - query: "query AllPetsQuery { allPets { ... on Animal { id name kind } } }", + name: "Should create an execution plan for a query with filtered categories", + query: "query FilterCategoriesQuery($filter: CategoryFilter!) { filterCategories(filter: $filter) { id name kind } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryAllPets", + MethodName: "QueryFilterCategories", Request: RPCMessage{ - Name: "QueryAllPetsRequest", - }, - Response: RPCMessage{ - Name: "QueryAllPetsResponse", + Name: "QueryFilterCategoriesRequest", Fields: []RPCField{ { - Name: "all_pets", + Name: "filter", TypeName: string(DataTypeMessage), - JSONPath: "allPets", - Repeated: true, + JSONPath: "filter", Message: &RPCMessage{ - Name: "Animal", - OneOfType: OneOfTypeInterface, - MemberTypes: []string{ - "Cat", - "Dog", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "Animal": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeString), - JSONPath: "kind", + Name: "CategoryFilter", + Fields: []RPCField{ + { + Name: "category", + TypeName: string(DataTypeEnum), + JSONPath: "category", + EnumName: "CategoryKind", + }, + { + Name: "pagination", + TypeName: string(DataTypeMessage), + JSONPath: "pagination", + Message: &RPCMessage{ + Name: "Pagination", + Fields: []RPCField{ + { + Name: "page", + TypeName: string(DataTypeInt32), + JSONPath: "page", + }, + { + Name: "per_page", + TypeName: string(DataTypeInt32), + JSONPath: "perPage", + }, + }, }, }, }, @@ -1674,35 +1276,16 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, }, }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with interface selecting only common fields", - query: "query CommonFieldsQuery { randomPet { id name kind } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryRandomPet", - Request: RPCMessage{ - Name: "QueryRandomPetRequest", - }, Response: RPCMessage{ - Name: "QueryRandomPetResponse", + Name: "QueryFilterCategoriesResponse", Fields: []RPCField{ { - Name: "random_pet", + Name: "filter_categories", TypeName: string(DataTypeMessage), - JSONPath: "randomPet", + JSONPath: "filterCategories", + Repeated: true, Message: &RPCMessage{ - Name: "Animal", - OneOfType: OneOfTypeInterface, - MemberTypes: []string{ - "Cat", - "Dog", - }, + Name: "Category", Fields: []RPCField{ { Name: "id", @@ -1716,8 +1299,9 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, { Name: "kind", - TypeName: string(DataTypeString), + TypeName: string(DataTypeEnum), JSONPath: "kind", + EnumName: "CategoryKind", }, }, }, @@ -1728,104 +1312,146 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, }, }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + report := &operationreport.Report{} + // Parse the GraphQL schema + schemaDoc := grpctest.MustGraphQLSchema(t) + + astvalidation.DefaultDefinitionValidator().Validate(&schemaDoc, report) + if report.HasErrors() { + t.Fatalf("failed to validate schema: %s", report.Error()) + } + + // Parse the GraphQL query + queryDoc, queryReport := astparser.ParseGraphqlDocumentString(tt.query) + if queryReport.HasErrors() { + t.Fatalf("failed to parse query: %s", queryReport.Error()) + } + + astvalidation.DefaultOperationValidator().Validate(&queryDoc, &schemaDoc, report) + if report.HasErrors() { + t.Fatalf("failed to validate query: %s", report.Error()) + } + + planner := NewPlanner("Products", testMapping()) + outPlan, err := planner.PlanOperation(&queryDoc, &schemaDoc) + + if tt.expectedError != "" { + if err == nil { + t.Fatalf("expected error, got nil") + } + if !strings.Contains(err.Error(), tt.expectedError) { + t.Fatalf("expected error to contain %q, got %q", tt.expectedError, err.Error()) + } + return + } + + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + + diff := cmp.Diff(tt.expectedPlan, outPlan) + if diff != "" { + t.Fatalf("execution plan mismatch: %s", diff) + } + }) + } +} + +func TestProductExecutionPlanWithAliases(t *testing.T) { + tests := []struct { + name string + query string + expectedPlan *RPCExecutionPlan + expectedError string + }{ { - name: "Should create an execution plan for a SearchResult union query", - query: "query SearchQuery($input: SearchInput!) { search(input: $input) { ... on Product { id name price } ... on User { id name } ... on Category { id name kind } } }", + name: "Should create an execution plan for a query with an alias on the users root field", + query: "query { foo: users { id name } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QuerySearch", + MethodName: "QueryUsers", Request: RPCMessage{ - Name: "QuerySearchRequest", - Fields: []RPCField{ + Name: "QueryUsersRequest", + }, + Response: RPCMessage{ + Name: "QueryUsersResponse", + Fields: RPCFields{ { - Name: "input", + Name: "users", TypeName: string(DataTypeMessage), - JSONPath: "input", + JSONPath: "users", + Alias: "foo", + Repeated: true, Message: &RPCMessage{ - Name: "SearchInput", - Fields: []RPCField{ + Name: "User", + Fields: RPCFields{ { - Name: "query", + Name: "id", TypeName: string(DataTypeString), - JSONPath: "query", + JSONPath: "id", }, { - Name: "limit", - TypeName: string(DataTypeInt32), - JSONPath: "limit", - Optional: true, + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", }, }, }, }, }, }, - Response: RPCMessage{ - Name: "QuerySearchResponse", + }, + }, + }, + }, + { + name: "Should create an execution plan for a query with an alias on a field with arguments", + query: `query { specificUser: user(id: "123") { userId: id userName: name } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryUser", + Request: RPCMessage{ + Name: "QueryUserRequest", Fields: []RPCField{ { - Name: "search", + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + }, + }, + Response: RPCMessage{ + Name: "QueryUserResponse", + Fields: RPCFields{ + { + Name: "user", TypeName: string(DataTypeMessage), - JSONPath: "search", - Repeated: true, + JSONPath: "user", + Alias: "specificUser", + Optional: true, Message: &RPCMessage{ - Name: "SearchResult", - OneOfType: OneOfTypeUnion, - MemberTypes: []string{ - "Product", - "User", - "Category", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "Product": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "price", - TypeName: string(DataTypeDouble), - JSONPath: "price", - }, - }, - "User": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, + Name: "User", + Fields: RPCFields{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + Alias: "userId", }, - "Category": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - EnumName: "CategoryKind", - }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "userName", }, }, }, @@ -1837,1300 +1463,15 @@ func TestCompositeTypeExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for a single SearchResult union query", - query: "query RandomSearchQuery { randomSearchResult { ... on Product { id name price } ... on User { id name } ... on Category { id name kind } } }", + name: "Should create an execution plan for a query with multiple aliases on the same level", + query: "query { allUsers: users { id name } allCategories: categories { id name categoryType: kind } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryRandomSearchResult", + MethodName: "QueryUsers", Request: RPCMessage{ - Name: "QueryRandomSearchResultRequest", - }, - Response: RPCMessage{ - Name: "QueryRandomSearchResultResponse", - Fields: []RPCField{ - { - Name: "random_search_result", - TypeName: string(DataTypeMessage), - JSONPath: "randomSearchResult", - Message: &RPCMessage{ - Name: "SearchResult", - OneOfType: OneOfTypeUnion, - MemberTypes: []string{ - "Product", - "User", - "Category", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "Product": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "price", - TypeName: string(DataTypeDouble), - JSONPath: "price", - }, - }, - "User": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - }, - "Category": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - EnumName: "CategoryKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a SearchResult union with partial selection", - query: "query PartialSearchQuery($input: SearchInput!) { search(input: $input) { ... on Product { id name } ... on User { id name } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QuerySearch", - Request: RPCMessage{ - Name: "QuerySearchRequest", - Fields: []RPCField{ - { - Name: "input", - TypeName: string(DataTypeMessage), - JSONPath: "input", - Message: &RPCMessage{ - Name: "SearchInput", - Fields: []RPCField{ - { - Name: "query", - TypeName: string(DataTypeString), - JSONPath: "query", - }, - { - Name: "limit", - TypeName: string(DataTypeInt32), - JSONPath: "limit", - Optional: true, - }, - }, - }, - }, - }, - }, - Response: RPCMessage{ - Name: "QuerySearchResponse", - Fields: []RPCField{ - { - Name: "search", - TypeName: string(DataTypeMessage), - JSONPath: "search", - Repeated: true, - Message: &RPCMessage{ - Name: "SearchResult", - OneOfType: OneOfTypeUnion, - MemberTypes: []string{ - "Product", - "User", - "Category", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "Product": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - }, - "User": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - // Parse the GraphQL schema - schemaDoc := grpctest.MustGraphQLSchema(t) - - // Parse the GraphQL query - queryDoc, report := astparser.ParseGraphqlDocumentString(tt.query) - if report.HasErrors() { - t.Fatalf("failed to parse query: %s", report.Error()) - } - - walker := astvisitor.NewWalker(48) - - rpcPlanVisitor := newRPCPlanVisitor(&walker, rpcPlanVisitorConfig{ - subgraphName: "Products", - mapping: testMapping(), - }) - - walker.Walk(&queryDoc, &schemaDoc, &report) - - if report.HasErrors() { - require.NotEmpty(t, tt.expectedError) - require.Contains(t, report.Error(), tt.expectedError) - return - } - - require.Empty(t, tt.expectedError) - diff := cmp.Diff(tt.expectedPlan, rpcPlanVisitor.plan) - if diff != "" { - t.Fatalf("execution plan mismatch: %s", diff) - } - }) - } -} - -func TestMutationUnionExecutionPlan(t *testing.T) { - tests := []struct { - name string - query string - expectedPlan *RPCExecutionPlan - expectedError string - }{ - { - name: "Should create an execution plan for ActionResult union mutation", - query: "mutation PerformActionMutation($input: ActionInput!) { performAction(input: $input) { ... on ActionSuccess { message timestamp } ... on ActionError { message code } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "MutationPerformAction", - Request: RPCMessage{ - Name: "MutationPerformActionRequest", - Fields: []RPCField{ - { - Name: "input", - TypeName: string(DataTypeMessage), - JSONPath: "input", - Message: &RPCMessage{ - Name: "ActionInput", - Fields: []RPCField{ - { - Name: "type", - TypeName: string(DataTypeString), - JSONPath: "type", - }, - { - Name: "payload", - TypeName: string(DataTypeString), - JSONPath: "payload", - }, - }, - }, - }, - }, - }, - Response: RPCMessage{ - Name: "MutationPerformActionResponse", - Fields: []RPCField{ - { - Name: "perform_action", - TypeName: string(DataTypeMessage), - JSONPath: "performAction", - Message: &RPCMessage{ - Name: "ActionResult", - OneOfType: OneOfTypeUnion, - MemberTypes: []string{ - "ActionSuccess", - "ActionError", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "ActionSuccess": { - { - Name: "message", - TypeName: string(DataTypeString), - JSONPath: "message", - }, - { - Name: "timestamp", - TypeName: string(DataTypeString), - JSONPath: "timestamp", - }, - }, - "ActionError": { - { - Name: "message", - TypeName: string(DataTypeString), - JSONPath: "message", - }, - { - Name: "code", - TypeName: string(DataTypeString), - JSONPath: "code", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for ActionResult union with only success case", - query: "mutation PerformSuccessActionMutation($input: ActionInput!) { performAction(input: $input) { ... on ActionSuccess { message timestamp } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "MutationPerformAction", - Request: RPCMessage{ - Name: "MutationPerformActionRequest", - Fields: []RPCField{ - { - Name: "input", - TypeName: string(DataTypeMessage), - JSONPath: "input", - Message: &RPCMessage{ - Name: "ActionInput", - Fields: []RPCField{ - { - Name: "type", - TypeName: string(DataTypeString), - JSONPath: "type", - }, - { - Name: "payload", - TypeName: string(DataTypeString), - JSONPath: "payload", - }, - }, - }, - }, - }, - }, - Response: RPCMessage{ - Name: "MutationPerformActionResponse", - Fields: []RPCField{ - { - Name: "perform_action", - TypeName: string(DataTypeMessage), - JSONPath: "performAction", - Message: &RPCMessage{ - Name: "ActionResult", - OneOfType: OneOfTypeUnion, - MemberTypes: []string{ - "ActionSuccess", - "ActionError", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "ActionSuccess": { - { - Name: "message", - TypeName: string(DataTypeString), - JSONPath: "message", - }, - { - Name: "timestamp", - TypeName: string(DataTypeString), - JSONPath: "timestamp", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for ActionResult union with only error case", - query: "mutation PerformErrorActionMutation($input: ActionInput!) { performAction(input: $input) { ... on ActionError { message code } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "MutationPerformAction", - Request: RPCMessage{ - Name: "MutationPerformActionRequest", - Fields: []RPCField{ - { - Name: "input", - TypeName: string(DataTypeMessage), - JSONPath: "input", - Message: &RPCMessage{ - Name: "ActionInput", - Fields: []RPCField{ - { - Name: "type", - TypeName: string(DataTypeString), - JSONPath: "type", - }, - { - Name: "payload", - TypeName: string(DataTypeString), - JSONPath: "payload", - }, - }, - }, - }, - }, - }, - Response: RPCMessage{ - Name: "MutationPerformActionResponse", - Fields: []RPCField{ - { - Name: "perform_action", - TypeName: string(DataTypeMessage), - JSONPath: "performAction", - Message: &RPCMessage{ - Name: "ActionResult", - OneOfType: OneOfTypeUnion, - MemberTypes: []string{ - "ActionSuccess", - "ActionError", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "ActionError": { - { - Name: "message", - TypeName: string(DataTypeString), - JSONPath: "message", - }, - { - Name: "code", - TypeName: string(DataTypeString), - JSONPath: "code", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - // Parse the GraphQL schema - schemaDoc := grpctest.MustGraphQLSchema(t) - - // Parse the GraphQL query - queryDoc, report := astparser.ParseGraphqlDocumentString(tt.query) - if report.HasErrors() { - t.Fatalf("failed to parse query: %s", report.Error()) - } - - walker := astvisitor.NewWalker(48) - - rpcPlanVisitor := newRPCPlanVisitor(&walker, rpcPlanVisitorConfig{ - subgraphName: "Products", - mapping: testMapping(), - }) - - walker.Walk(&queryDoc, &schemaDoc, &report) - - if report.HasErrors() { - require.NotEmpty(t, tt.expectedError) - require.Contains(t, report.Error(), tt.expectedError) - return - } - - require.Empty(t, tt.expectedError) - diff := cmp.Diff(tt.expectedPlan, rpcPlanVisitor.plan) - if diff != "" { - t.Fatalf("execution plan mismatch: %s", diff) - } - }) - } -} - -func TestProductExecutionPlan(t *testing.T) { - tests := []struct { - name string - query string - expectedPlan *RPCExecutionPlan - expectedError string - }{ - { - name: "Should create an execution plan for a query with categories by kind", - query: "query CategoriesQuery($kind: CategoryKind!) { categoriesByKind(kind: $kind) { id name kind } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryCategoriesByKind", - Request: RPCMessage{ - Name: "QueryCategoriesByKindRequest", - Fields: []RPCField{ - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - EnumName: "CategoryKind", - }, - }, - }, - Response: RPCMessage{ - Name: "QueryCategoriesByKindResponse", - Fields: []RPCField{ - { - Name: "categories_by_kind", - TypeName: string(DataTypeMessage), - JSONPath: "categoriesByKind", - Repeated: true, - Message: &RPCMessage{ - Name: "Category", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - EnumName: "CategoryKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with categories by kinds", - query: "query CategoriesQuery($kinds: [CategoryKind!]!) { categoriesByKinds(kinds: $kinds) { id name kind } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryCategoriesByKinds", - Request: RPCMessage{ - Name: "QueryCategoriesByKindsRequest", - Fields: []RPCField{ - { - Name: "kinds", - TypeName: string(DataTypeEnum), - JSONPath: "kinds", - EnumName: "CategoryKind", - Repeated: true, - }, - }, - }, - Response: RPCMessage{ - Name: "QueryCategoriesByKindsResponse", - Fields: []RPCField{ - { - Name: "categories_by_kinds", - TypeName: string(DataTypeMessage), - JSONPath: "categoriesByKinds", - Repeated: true, - Message: &RPCMessage{ - Name: "Category", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - EnumName: "CategoryKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with filtered categories", - query: "query FilterCategoriesQuery($filter: CategoryFilter!) { filterCategories(filter: $filter) { id name kind } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryFilterCategories", - Request: RPCMessage{ - Name: "QueryFilterCategoriesRequest", - Fields: []RPCField{ - { - Name: "filter", - TypeName: string(DataTypeMessage), - JSONPath: "filter", - Message: &RPCMessage{ - Name: "CategoryFilter", - Fields: []RPCField{ - { - Name: "category", - TypeName: string(DataTypeEnum), - JSONPath: "category", - EnumName: "CategoryKind", - }, - { - Name: "pagination", - TypeName: string(DataTypeMessage), - JSONPath: "pagination", - Message: &RPCMessage{ - Name: "Pagination", - Fields: []RPCField{ - { - Name: "page", - TypeName: string(DataTypeInt32), - JSONPath: "page", - }, - { - Name: "per_page", - TypeName: string(DataTypeInt32), - JSONPath: "perPage", - }, - }, - }, - }, - }, - }, - }, - }, - }, - Response: RPCMessage{ - Name: "QueryFilterCategoriesResponse", - Fields: []RPCField{ - { - Name: "filter_categories", - TypeName: string(DataTypeMessage), - JSONPath: "filterCategories", - Repeated: true, - Message: &RPCMessage{ - Name: "Category", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - EnumName: "CategoryKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - report := &operationreport.Report{} - // Parse the GraphQL schema - schemaDoc := grpctest.MustGraphQLSchema(t) - - astvalidation.DefaultDefinitionValidator().Validate(&schemaDoc, report) - if report.HasErrors() { - t.Fatalf("failed to validate schema: %s", report.Error()) - } - - // Parse the GraphQL query - queryDoc, queryReport := astparser.ParseGraphqlDocumentString(tt.query) - if queryReport.HasErrors() { - t.Fatalf("failed to parse query: %s", queryReport.Error()) - } - - astvalidation.DefaultOperationValidator().Validate(&queryDoc, &schemaDoc, report) - if report.HasErrors() { - t.Fatalf("failed to validate query: %s", report.Error()) - } - - planner := NewPlanner("Products", testMapping()) - outPlan, err := planner.PlanOperation(&queryDoc, &schemaDoc) - - if tt.expectedError != "" { - if err == nil { - t.Fatalf("expected error, got nil") - } - if !strings.Contains(err.Error(), tt.expectedError) { - t.Fatalf("expected error to contain %q, got %q", tt.expectedError, err.Error()) - } - return - } - - if err != nil { - t.Fatalf("unexpected error: %s", err) - } - - diff := cmp.Diff(tt.expectedPlan, outPlan) - if diff != "" { - t.Fatalf("execution plan mismatch: %s", diff) - } - }) - } -} - -func TestProductExecutionPlanWithAliases(t *testing.T) { - tests := []struct { - name string - query string - expectedPlan *RPCExecutionPlan - expectedError string - }{ - { - name: "Should create an execution plan for a query with an alias on the users root field", - query: "query { foo: users { id name } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryUsers", - Request: RPCMessage{ - Name: "QueryUsersRequest", - }, - Response: RPCMessage{ - Name: "QueryUsersResponse", - Fields: RPCFields{ - { - Name: "users", - TypeName: string(DataTypeMessage), - JSONPath: "users", - Alias: "foo", - Repeated: true, - Message: &RPCMessage{ - Name: "User", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with an alias on a field with arguments", - query: `query { specificUser: user(id: "123") { userId: id userName: name } }`, - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryUser", - Request: RPCMessage{ - Name: "QueryUserRequest", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - }, - }, - Response: RPCMessage{ - Name: "QueryUserResponse", - Fields: RPCFields{ - { - Name: "user", - TypeName: string(DataTypeMessage), - JSONPath: "user", - Alias: "specificUser", - Optional: true, - Message: &RPCMessage{ - Name: "User", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "userId", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "userName", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with multiple aliases on the same level", - query: "query { allUsers: users { id name } allCategories: categories { id name categoryType: kind } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryUsers", - Request: RPCMessage{ - Name: "QueryUsersRequest", - }, - Response: RPCMessage{ - Name: "QueryUsersResponse", - Fields: RPCFields{ - { - Name: "users", - TypeName: string(DataTypeMessage), - JSONPath: "users", - Alias: "allUsers", - Repeated: true, - Message: &RPCMessage{ - Name: "User", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - }, - }, - }, - }, - }, - }, - { - ServiceName: "Products", - MethodName: "QueryCategories", - CallID: 1, - Request: RPCMessage{ - Name: "QueryCategoriesRequest", - }, - Response: RPCMessage{ - Name: "QueryCategoriesResponse", - Fields: RPCFields{ - { - Name: "categories", - TypeName: string(DataTypeMessage), - JSONPath: "categories", - Alias: "allCategories", - Repeated: true, - Message: &RPCMessage{ - Name: "Category", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - Alias: "categoryType", - EnumName: "CategoryKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with aliases on nested object fields", - query: "query { nestedData: nestedType { identifier: id title: name childB: b { identifier: id title: name grandChild: c { identifier: id title: name } } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryNestedType", - Request: RPCMessage{ - Name: "QueryNestedTypeRequest", - }, - Response: RPCMessage{ - Name: "QueryNestedTypeResponse", - Fields: RPCFields{ - { - Name: "nested_type", - TypeName: string(DataTypeMessage), - JSONPath: "nestedType", - Alias: "nestedData", - Repeated: true, - Message: &RPCMessage{ - Name: "NestedTypeA", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "identifier", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "title", - }, - { - Name: "b", - TypeName: string(DataTypeMessage), - JSONPath: "b", - Alias: "childB", - Message: &RPCMessage{ - Name: "NestedTypeB", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "identifier", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "title", - }, - { - Name: "c", - TypeName: string(DataTypeMessage), - JSONPath: "c", - Alias: "grandChild", - Message: &RPCMessage{ - Name: "NestedTypeC", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "identifier", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "title", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with aliases on interface fields", - query: "query { pet: randomPet { identifier: id petName: name animalKind: kind ... on Cat { volumeLevel: meowVolume } ... on Dog { volumeLevel: barkVolume } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryRandomPet", - Request: RPCMessage{ - Name: "QueryRandomPetRequest", - }, - Response: RPCMessage{ - Name: "QueryRandomPetResponse", - Fields: RPCFields{ - { - Name: "random_pet", - TypeName: string(DataTypeMessage), - JSONPath: "randomPet", - Alias: "pet", - Message: &RPCMessage{ - Name: "Animal", - OneOfType: OneOfTypeInterface, - MemberTypes: []string{ - "Cat", - "Dog", - }, - FieldSelectionSet: RPCFieldSelectionSet{ - "Cat": { - { - Name: "meow_volume", - TypeName: string(DataTypeInt32), - JSONPath: "meowVolume", - Alias: "volumeLevel", - }, - }, - "Dog": { - { - Name: "bark_volume", - TypeName: string(DataTypeInt32), - JSONPath: "barkVolume", - Alias: "volumeLevel", - }, - }, - }, - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "identifier", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "petName", - }, - { - Name: "kind", - TypeName: string(DataTypeString), - JSONPath: "kind", - Alias: "animalKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with aliases on union type fields", - query: "query { searchResults: randomSearchResult { ... on Product { productId: id productName: name cost: price } ... on User { userId: id userName: name } ... on Category { categoryId: id categoryName: name categoryType: kind } } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryRandomSearchResult", - Request: RPCMessage{ - Name: "QueryRandomSearchResultRequest", - }, - Response: RPCMessage{ - Name: "QueryRandomSearchResultResponse", - Fields: RPCFields{ - { - Name: "random_search_result", - TypeName: string(DataTypeMessage), - JSONPath: "randomSearchResult", - Alias: "searchResults", - Message: &RPCMessage{ - Name: "SearchResult", - OneOfType: OneOfTypeUnion, - MemberTypes: []string{ - "Product", - "User", - "Category", - }, - Fields: RPCFields{}, - FieldSelectionSet: RPCFieldSelectionSet{ - "Product": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "productId", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "productName", - }, - { - Name: "price", - TypeName: string(DataTypeDouble), - JSONPath: "price", - Alias: "cost", - }, - }, - "User": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "userId", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "userName", - }, - }, - "Category": { - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "categoryId", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "categoryName", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - Alias: "categoryType", - EnumName: "CategoryKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a mutation with aliases", - query: `mutation { newUser: createUser(input: { name: "John Doe" }) { userId: id fullName: name } }`, - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "MutationCreateUser", - Request: RPCMessage{ - Name: "MutationCreateUserRequest", - Fields: []RPCField{ - { - Name: "input", - TypeName: string(DataTypeMessage), - JSONPath: "input", - Message: &RPCMessage{ - Name: "UserInput", - Fields: []RPCField{ - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - }, - }, - }, - }, - }, - Response: RPCMessage{ - Name: "MutationCreateUserResponse", - Fields: RPCFields{ - { - Name: "create_user", - TypeName: string(DataTypeMessage), - JSONPath: "createUser", - Alias: "newUser", - Message: &RPCMessage{ - Name: "User", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "userId", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "fullName", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with aliases on field with complex input type", - query: `query { bookCategories: categoriesByKind(kind: BOOK) { identifier: id title: name type: kind } }`, - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryCategoriesByKind", - Request: RPCMessage{ - Name: "QueryCategoriesByKindRequest", - Fields: []RPCField{ - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - EnumName: "CategoryKind", - }, - }, - }, - Response: RPCMessage{ - Name: "QueryCategoriesByKindResponse", - Fields: RPCFields{ - { - Name: "categories_by_kind", - TypeName: string(DataTypeMessage), - JSONPath: "categoriesByKind", - Alias: "bookCategories", - Repeated: true, - Message: &RPCMessage{ - Name: "Category", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - Alias: "identifier", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "title", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - Alias: "type", - EnumName: "CategoryKind", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with multiple aliases for the same field", - query: `query { users { id name1: name name2: name name3: name } }`, - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryUsers", - Request: RPCMessage{ - Name: "QueryUsersRequest", + Name: "QueryUsersRequest", }, Response: RPCMessage{ Name: "QueryUsersResponse", @@ -3139,111 +1480,8 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "users", TypeName: string(DataTypeMessage), JSONPath: "users", - Repeated: true, - Message: &RPCMessage{ - Name: "User", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name2", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name3", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - name: "Should create an execution plan for a query with multiple aliases for the same field with arguments", - query: `query { user1: user(id: "123") { id name } user2: user(id: "456") { id name } sameUser: user(id: "123") { userId: id userName: name } }`, - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryUser", - Request: RPCMessage{ - Name: "QueryUserRequest", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - }, - }, - Response: RPCMessage{ - Name: "QueryUserResponse", - Fields: RPCFields{ - { - Name: "user", - TypeName: string(DataTypeMessage), - JSONPath: "user", - Alias: "user1", - Optional: true, - Message: &RPCMessage{ - Name: "User", - Fields: RPCFields{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - }, - }, - }, - }, - }, - }, - { - ServiceName: "Products", - MethodName: "QueryUser", - CallID: 1, - Request: RPCMessage{ - Name: "QueryUserRequest", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - }, - }, - Response: RPCMessage{ - Name: "QueryUserResponse", - Fields: RPCFields{ - { - Name: "user", - TypeName: string(DataTypeMessage), - JSONPath: "user", - Alias: "user2", - Optional: true, + Alias: "allUsers", + Repeated: true, Message: &RPCMessage{ Name: "User", Fields: RPCFields{ @@ -3265,41 +1503,39 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { }, { ServiceName: "Products", - MethodName: "QueryUser", - CallID: 2, + MethodName: "QueryCategories", + CallID: 1, Request: RPCMessage{ - Name: "QueryUserRequest", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - }, + Name: "QueryCategoriesRequest", }, Response: RPCMessage{ - Name: "QueryUserResponse", + Name: "QueryCategoriesResponse", Fields: RPCFields{ { - Name: "user", + Name: "categories", TypeName: string(DataTypeMessage), - JSONPath: "user", - Alias: "sameUser", - Optional: true, + JSONPath: "categories", + Alias: "allCategories", + Repeated: true, Message: &RPCMessage{ - Name: "User", + Name: "Category", Fields: RPCFields{ { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", - Alias: "userId", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "userName", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + Alias: "categoryType", + EnumName: "CategoryKind", }, }, }, @@ -3311,8 +1547,8 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { }, }, { - name: "Should create an execution plan for a query with multiple aliases for the same field in nested objects", - query: `query { nestedType { id name1: name name2: name b { id title1: name title2: name c { id label1: name label2: name } } } }`, + name: "Should create an execution plan for a query with aliases on nested object fields", + query: "query { nestedData: nestedType { identifier: id title: name childB: b { identifier: id title: name grandChild: c { identifier: id title: name } } } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { @@ -3328,6 +1564,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "nested_type", TypeName: string(DataTypeMessage), JSONPath: "nestedType", + Alias: "nestedData", Repeated: true, Message: &RPCMessage{ Name: "NestedTypeA", @@ -3336,23 +1573,19 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "identifier", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "name1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name2", + Alias: "title", }, { Name: "b", TypeName: string(DataTypeMessage), JSONPath: "b", + Alias: "childB", Message: &RPCMessage{ Name: "NestedTypeB", Fields: RPCFields{ @@ -3360,23 +1593,19 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "identifier", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "title1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "title2", + Alias: "title", }, { Name: "c", TypeName: string(DataTypeMessage), JSONPath: "c", + Alias: "grandChild", Message: &RPCMessage{ Name: "NestedTypeC", Fields: RPCFields{ @@ -3384,18 +1613,13 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "identifier", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "label1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "label2", + Alias: "title", }, }, }, @@ -3413,8 +1637,8 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { }, }, { - name: "Should create an execution plan for a query with multiple aliases for the same field in interface fragments", - query: `query { randomPet { id name1: name name2: name kind ... on Cat { volume1: meowVolume volume2: meowVolume } ... on Dog { volume1: barkVolume volume2: barkVolume } } }`, + name: "Should create an execution plan for a query with aliases on interface fields", + query: "query { pet: randomPet { identifier: id petName: name animalKind: kind ... on Cat { volumeLevel: meowVolume } ... on Dog { volumeLevel: barkVolume } } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { @@ -3430,6 +1654,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "random_pet", TypeName: string(DataTypeMessage), JSONPath: "randomPet", + Alias: "pet", Message: &RPCMessage{ Name: "Animal", OneOfType: OneOfTypeInterface, @@ -3443,13 +1668,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "meow_volume", TypeName: string(DataTypeInt32), JSONPath: "meowVolume", - Alias: "volume1", - }, - { - Name: "meow_volume", - TypeName: string(DataTypeInt32), - JSONPath: "meowVolume", - Alias: "volume2", + Alias: "volumeLevel", }, }, "Dog": { @@ -3457,13 +1676,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "bark_volume", TypeName: string(DataTypeInt32), JSONPath: "barkVolume", - Alias: "volume1", - }, - { - Name: "bark_volume", - TypeName: string(DataTypeInt32), - JSONPath: "barkVolume", - Alias: "volume2", + Alias: "volumeLevel", }, }, }, @@ -3472,23 +1685,19 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "identifier", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "name1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name2", + Alias: "petName", }, { Name: "kind", TypeName: string(DataTypeString), JSONPath: "kind", + Alias: "animalKind", }, }, }, @@ -3500,8 +1709,8 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { }, }, { - name: "Should create an execution plan for a query with multiple aliases for the same field in union fragments", - query: `query { randomSearchResult { ... on Product { id name1: name name2: name price1: price price2: price } ... on User { id name1: name name2: name } ... on Category { id name1: name name2: name kind1: kind kind2: kind } } }`, + name: "Should create an execution plan for a query with aliases on union type fields", + query: "query { searchResults: randomSearchResult { ... on Product { productId: id productName: name cost: price } ... on User { userId: id userName: name } ... on Category { categoryId: id categoryName: name categoryType: kind } } }", expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { @@ -3517,6 +1726,7 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "random_search_result", TypeName: string(DataTypeMessage), JSONPath: "randomSearchResult", + Alias: "searchResults", Message: &RPCMessage{ Name: "SearchResult", OneOfType: OneOfTypeUnion, @@ -3532,30 +1742,19 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "productId", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "name1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name2", - }, - { - Name: "price", - TypeName: string(DataTypeDouble), - JSONPath: "price", - Alias: "price1", + Alias: "productName", }, { Name: "price", TypeName: string(DataTypeDouble), JSONPath: "price", - Alias: "price2", + Alias: "cost", }, }, "User": { @@ -3563,18 +1762,13 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "userId", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "name1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name2", + Alias: "userName", }, }, "Category": { @@ -3582,31 +1776,19 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "categoryId", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Alias: "name1", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - Alias: "name2", - }, - { - Name: "kind", - TypeName: string(DataTypeEnum), - JSONPath: "kind", - Alias: "kind1", - EnumName: "CategoryKind", + Alias: "categoryName", }, { Name: "kind", TypeName: string(DataTypeEnum), JSONPath: "kind", - Alias: "kind2", + Alias: "categoryType", EnumName: "CategoryKind", }, }, @@ -3619,173 +1801,28 @@ func TestProductExecutionPlanWithAliases(t *testing.T) { }, }, }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - report := &operationreport.Report{} - // Parse the GraphQL schema - schemaDoc := grpctest.MustGraphQLSchema(t) - - astvalidation.DefaultDefinitionValidator().Validate(&schemaDoc, report) - if report.HasErrors() { - t.Fatalf("failed to validate schema: %s", report.Error()) - } - - // Parse the GraphQL query - queryDoc, queryReport := astparser.ParseGraphqlDocumentString(tt.query) - if queryReport.HasErrors() { - t.Fatalf("failed to parse query: %s", queryReport.Error()) - } - - astvalidation.DefaultOperationValidator().Validate(&queryDoc, &schemaDoc, report) - if report.HasErrors() { - t.Fatalf("failed to validate query: %s", report.Error()) - } - - planner := NewPlanner("Products", testMapping()) - outPlan, err := planner.PlanOperation(&queryDoc, &schemaDoc) - - if tt.expectedError != "" { - if err == nil { - t.Fatalf("expected error, got nil") - } - if !strings.Contains(err.Error(), tt.expectedError) { - t.Fatalf("expected error to contain %q, got %q", tt.expectedError, err.Error()) - } - return - } - - if err != nil { - t.Fatalf("unexpected error: %s", err) - } - - diff := cmp.Diff(tt.expectedPlan, outPlan) - if diff != "" { - t.Fatalf("execution plan mismatch: %s", diff) - } - }) - } - -} - -func TestNullableFieldsExecutionPlan(t *testing.T) { - tests := []struct { - name string - query string - expectedPlan *RPCExecutionPlan - expectedError string - }{ - { - name: "Should create an execution plan for a query with nullable fields type", - query: "query NullableFieldsTypeQuery { nullableFieldsType { id name optionalString optionalInt optionalFloat optionalBoolean requiredString requiredInt } }", - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ - { - ServiceName: "Products", - MethodName: "QueryNullableFieldsType", - Request: RPCMessage{ - Name: "QueryNullableFieldsTypeRequest", - }, - Response: RPCMessage{ - Name: "QueryNullableFieldsTypeResponse", - Fields: []RPCField{ - { - Name: "nullable_fields_type", - TypeName: string(DataTypeMessage), - JSONPath: "nullableFieldsType", - Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ - { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", - }, - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, - { - Name: "optional_string", - TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "optional_int", - TypeName: string(DataTypeInt32), - JSONPath: "optionalInt", - Optional: true, - }, - { - Name: "optional_float", - TypeName: string(DataTypeDouble), - JSONPath: "optionalFloat", - Optional: true, - }, - { - Name: "optional_boolean", - TypeName: string(DataTypeBool), - JSONPath: "optionalBoolean", - Optional: true, - }, - { - Name: "required_string", - TypeName: string(DataTypeString), - JSONPath: "requiredString", - }, - { - Name: "required_int", - TypeName: string(DataTypeInt32), - JSONPath: "requiredInt", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, { - name: "Should create an execution plan for a query with nullable fields in the request", - query: `query NullableFieldsTypeWithFilterQuery($filter: NullableFieldsFilter!) { nullableFieldsTypeWithFilter(filter: $filter) { id name optionalString optionalInt optionalFloat optionalBoolean } }`, + name: "Should create an execution plan for a mutation with aliases", + query: `mutation { newUser: createUser(input: { name: "John Doe" }) { userId: id fullName: name } }`, expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryNullableFieldsTypeWithFilter", + MethodName: "MutationCreateUser", Request: RPCMessage{ - Name: "QueryNullableFieldsTypeWithFilterRequest", + Name: "MutationCreateUserRequest", Fields: []RPCField{ { - Name: "filter", + Name: "input", TypeName: string(DataTypeMessage), - JSONPath: "filter", + JSONPath: "input", Message: &RPCMessage{ - Name: "NullableFieldsFilter", + Name: "UserInput", Fields: []RPCField{ { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - Optional: true, - }, - { - Name: "optional_string", - TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "include_nulls", - TypeName: string(DataTypeBool), - JSONPath: "includeNulls", - Optional: true, }, }, }, @@ -3793,49 +1830,27 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { }, }, Response: RPCMessage{ - Name: "QueryNullableFieldsTypeWithFilterResponse", - Fields: []RPCField{ + Name: "MutationCreateUserResponse", + Fields: RPCFields{ { - Name: "nullable_fields_type_with_filter", + Name: "create_user", TypeName: string(DataTypeMessage), - JSONPath: "nullableFieldsTypeWithFilter", - Repeated: true, + JSONPath: "createUser", + Alias: "newUser", Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ + Name: "User", + Fields: RPCFields{ { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "userId", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", - }, - { - Name: "optional_string", - TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "optional_int", - TypeName: string(DataTypeInt32), - JSONPath: "optionalInt", - Optional: true, - }, - { - Name: "optional_float", - TypeName: string(DataTypeDouble), - JSONPath: "optionalFloat", - Optional: true, - }, - { - Name: "optional_boolean", - TypeName: string(DataTypeBool), - JSONPath: "optionalBoolean", - Optional: true, + Alias: "fullName", }, }, }, @@ -3847,54 +1862,54 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for nullable fields type by ID query", - query: `query NullableFieldsTypeByIdQuery($id: ID!) { nullableFieldsTypeById(id: $id) { id name optionalString requiredString } }`, + name: "Should create an execution plan for a query with aliases on field with complex input type", + query: `query { bookCategories: categoriesByKind(kind: BOOK) { identifier: id title: name type: kind } }`, expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryNullableFieldsTypeById", + MethodName: "QueryCategoriesByKind", Request: RPCMessage{ - Name: "QueryNullableFieldsTypeByIdRequest", + Name: "QueryCategoriesByKindRequest", Fields: []RPCField{ { - Name: "id", - TypeName: string(DataTypeString), - JSONPath: "id", + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", }, }, }, Response: RPCMessage{ - Name: "QueryNullableFieldsTypeByIdResponse", - Fields: []RPCField{ + Name: "QueryCategoriesByKindResponse", + Fields: RPCFields{ { - Name: "nullable_fields_type_by_id", + Name: "categories_by_kind", TypeName: string(DataTypeMessage), - JSONPath: "nullableFieldsTypeById", - Optional: true, + JSONPath: "categoriesByKind", + Alias: "bookCategories", + Repeated: true, Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ + Name: "Category", + Fields: RPCFields{ { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", + Alias: "identifier", }, { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", + Alias: "title", }, { - Name: "optional_string", - TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "required_string", - TypeName: string(DataTypeString), - JSONPath: "requiredString", + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + Alias: "type", + EnumName: "CategoryKind", }, }, }, @@ -3906,27 +1921,27 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for all nullable fields types query", - query: "query AllNullableFieldsTypesQuery { allNullableFieldsTypes { id name optionalString optionalInt requiredString requiredInt } }", + name: "Should create an execution plan for a query with multiple aliases for the same field", + query: `query { users { id name1: name name2: name name3: name } }`, expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryAllNullableFieldsTypes", + MethodName: "QueryUsers", Request: RPCMessage{ - Name: "QueryAllNullableFieldsTypesRequest", + Name: "QueryUsersRequest", }, Response: RPCMessage{ - Name: "QueryAllNullableFieldsTypesResponse", - Fields: []RPCField{ + Name: "QueryUsersResponse", + Fields: RPCFields{ { - Name: "all_nullable_fields_types", + Name: "users", TypeName: string(DataTypeMessage), - JSONPath: "allNullableFieldsTypes", + JSONPath: "users", Repeated: true, Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ + Name: "User", + Fields: RPCFields{ { Name: "id", TypeName: string(DataTypeString), @@ -3936,28 +1951,19 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", + Alias: "name1", }, { - Name: "optional_string", + Name: "name", TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "optional_int", - TypeName: string(DataTypeInt32), - JSONPath: "optionalInt", - Optional: true, + JSONPath: "name", + Alias: "name2", }, { - Name: "required_string", + Name: "name", TypeName: string(DataTypeString), - JSONPath: "requiredString", - }, - { - Name: "required_int", - TypeName: string(DataTypeInt32), - JSONPath: "requiredInt", + JSONPath: "name", + Alias: "name3", }, }, }, @@ -3969,77 +1975,77 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for create nullable fields type mutation", - query: `mutation CreateNullableFieldsType($input: NullableFieldsInput!) { createNullableFieldsType(input: $input) { id name optionalString optionalInt optionalFloat optionalBoolean requiredString requiredInt } }`, + name: "Should create an execution plan for a query with multiple aliases for the same field with arguments", + query: `query { user1: user(id: "123") { id name } user2: user(id: "456") { id name } sameUser: user(id: "123") { userId: id userName: name } }`, expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "MutationCreateNullableFieldsType", + MethodName: "QueryUser", Request: RPCMessage{ - Name: "MutationCreateNullableFieldsTypeRequest", + Name: "QueryUserRequest", Fields: []RPCField{ { - Name: "input", + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + }, + }, + Response: RPCMessage{ + Name: "QueryUserResponse", + Fields: RPCFields{ + { + Name: "user", TypeName: string(DataTypeMessage), - JSONPath: "input", + JSONPath: "user", + Alias: "user1", + Optional: true, Message: &RPCMessage{ - Name: "NullableFieldsInput", - Fields: []RPCField{ - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, + Name: "User", + Fields: RPCFields{ { - Name: "optional_string", + Name: "id", TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "optional_int", - TypeName: string(DataTypeInt32), - JSONPath: "optionalInt", - Optional: true, - }, - { - Name: "optional_float", - TypeName: string(DataTypeDouble), - JSONPath: "optionalFloat", - Optional: true, - }, - { - Name: "optional_boolean", - TypeName: string(DataTypeBool), - JSONPath: "optionalBoolean", - Optional: true, + JSONPath: "id", }, { - Name: "required_string", + Name: "name", TypeName: string(DataTypeString), - JSONPath: "requiredString", - }, - { - Name: "required_int", - TypeName: string(DataTypeInt32), - JSONPath: "requiredInt", + JSONPath: "name", }, }, }, }, }, }, - Response: RPCMessage{ - Name: "MutationCreateNullableFieldsTypeResponse", + }, + { + ServiceName: "Products", + MethodName: "QueryUser", + CallID: 1, + Request: RPCMessage{ + Name: "QueryUserRequest", Fields: []RPCField{ { - Name: "create_nullable_fields_type", + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + }, + }, + Response: RPCMessage{ + Name: "QueryUserResponse", + Fields: RPCFields{ + { + Name: "user", TypeName: string(DataTypeMessage), - JSONPath: "createNullableFieldsType", + JSONPath: "user", + Alias: "user2", + Optional: true, Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ + Name: "User", + Fields: RPCFields{ { Name: "id", TypeName: string(DataTypeString), @@ -4050,127 +2056,81 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { TypeName: string(DataTypeString), JSONPath: "name", }, - { - Name: "optional_string", - TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "optional_int", - TypeName: string(DataTypeInt32), - JSONPath: "optionalInt", - Optional: true, - }, - { - Name: "optional_float", - TypeName: string(DataTypeDouble), - JSONPath: "optionalFloat", - Optional: true, - }, - { - Name: "optional_boolean", - TypeName: string(DataTypeBool), - JSONPath: "optionalBoolean", - Optional: true, - }, - { - Name: "required_string", - TypeName: string(DataTypeString), - JSONPath: "requiredString", - }, - { - Name: "required_int", - TypeName: string(DataTypeInt32), - JSONPath: "requiredInt", - }, }, }, }, }, }, }, - }, - }, - }, - { - name: "Should create an execution plan for update nullable fields type mutation", - query: `mutation UpdateNullableFieldsType($id: ID!, $input: NullableFieldsInput!) { updateNullableFieldsType(id: $id, input: $input) { id name optionalString requiredString } }`, - expectedPlan: &RPCExecutionPlan{ - Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "MutationUpdateNullableFieldsType", + MethodName: "QueryUser", + CallID: 2, Request: RPCMessage{ - Name: "MutationUpdateNullableFieldsTypeRequest", + Name: "QueryUserRequest", Fields: []RPCField{ { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", }, + }, + }, + Response: RPCMessage{ + Name: "QueryUserResponse", + Fields: RPCFields{ { - Name: "input", + Name: "user", TypeName: string(DataTypeMessage), - JSONPath: "input", + JSONPath: "user", + Alias: "sameUser", + Optional: true, Message: &RPCMessage{ - Name: "NullableFieldsInput", - Fields: []RPCField{ - { - Name: "name", - TypeName: string(DataTypeString), - JSONPath: "name", - }, + Name: "User", + Fields: RPCFields{ { - Name: "optional_string", + Name: "id", TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "optional_int", - TypeName: string(DataTypeInt32), - JSONPath: "optionalInt", - Optional: true, - }, - { - Name: "optional_float", - TypeName: string(DataTypeDouble), - JSONPath: "optionalFloat", - Optional: true, - }, - { - Name: "optional_boolean", - TypeName: string(DataTypeBool), - JSONPath: "optionalBoolean", - Optional: true, + JSONPath: "id", + Alias: "userId", }, { - Name: "required_string", + Name: "name", TypeName: string(DataTypeString), - JSONPath: "requiredString", - }, - { - Name: "required_int", - TypeName: string(DataTypeInt32), - JSONPath: "requiredInt", + JSONPath: "name", + Alias: "userName", }, }, }, }, }, }, + }, + }, + }, + }, + { + name: "Should create an execution plan for a query with multiple aliases for the same field in nested objects", + query: `query { nestedType { id name1: name name2: name b { id title1: name title2: name c { id label1: name label2: name } } } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryNestedType", + Request: RPCMessage{ + Name: "QueryNestedTypeRequest", + }, Response: RPCMessage{ - Name: "MutationUpdateNullableFieldsTypeResponse", - Fields: []RPCField{ + Name: "QueryNestedTypeResponse", + Fields: RPCFields{ { - Name: "update_nullable_fields_type", + Name: "nested_type", TypeName: string(DataTypeMessage), - JSONPath: "updateNullableFieldsType", - Optional: true, + JSONPath: "nestedType", + Repeated: true, Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ + Name: "NestedTypeA", + Fields: RPCFields{ { Name: "id", TypeName: string(DataTypeString), @@ -4180,17 +2140,67 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { Name: "name", TypeName: string(DataTypeString), JSONPath: "name", + Alias: "name1", }, { - Name: "optional_string", + Name: "name", TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, + JSONPath: "name", + Alias: "name2", }, { - Name: "required_string", - TypeName: string(DataTypeString), - JSONPath: "requiredString", + Name: "b", + TypeName: string(DataTypeMessage), + JSONPath: "b", + Message: &RPCMessage{ + Name: "NestedTypeB", + Fields: RPCFields{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "title1", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "title2", + }, + { + Name: "c", + TypeName: string(DataTypeMessage), + JSONPath: "c", + Message: &RPCMessage{ + Name: "NestedTypeC", + Fields: RPCFields{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "label1", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "label2", + }, + }, + }, + }, + }, + }, }, }, }, @@ -4202,36 +2212,82 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for nullable fields with partial field selection", - query: "query PartialNullableFieldsQuery { nullableFieldsType { id optionalString } }", + name: "Should create an execution plan for a query with multiple aliases for the same field in interface fragments", + query: `query { randomPet { id name1: name name2: name kind ... on Cat { volume1: meowVolume volume2: meowVolume } ... on Dog { volume1: barkVolume volume2: barkVolume } } }`, expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryNullableFieldsType", + MethodName: "QueryRandomPet", Request: RPCMessage{ - Name: "QueryNullableFieldsTypeRequest", + Name: "QueryRandomPetRequest", }, Response: RPCMessage{ - Name: "QueryNullableFieldsTypeResponse", - Fields: []RPCField{ + Name: "QueryRandomPetResponse", + Fields: RPCFields{ { - Name: "nullable_fields_type", + Name: "random_pet", TypeName: string(DataTypeMessage), - JSONPath: "nullableFieldsType", + JSONPath: "randomPet", Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ + Name: "Animal", + OneOfType: OneOfTypeInterface, + MemberTypes: []string{ + "Cat", + "Dog", + }, + FieldSelectionSet: RPCFieldSelectionSet{ + "Cat": { + { + Name: "meow_volume", + TypeName: string(DataTypeInt32), + JSONPath: "meowVolume", + Alias: "volume1", + }, + { + Name: "meow_volume", + TypeName: string(DataTypeInt32), + JSONPath: "meowVolume", + Alias: "volume2", + }, + }, + "Dog": { + { + Name: "bark_volume", + TypeName: string(DataTypeInt32), + JSONPath: "barkVolume", + Alias: "volume1", + }, + { + Name: "bark_volume", + TypeName: string(DataTypeInt32), + JSONPath: "barkVolume", + Alias: "volume2", + }, + }, + }, + Fields: RPCFields{ { Name: "id", TypeName: string(DataTypeString), JSONPath: "id", }, { - Name: "optional_string", + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name1", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name2", + }, + { + Name: "kind", TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, + JSONPath: "kind", }, }, }, @@ -4243,49 +2299,115 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { }, }, { - name: "Should create an execution plan for nullable fields with only optional fields", - query: "query OptionalFieldsOnlyQuery { nullableFieldsType { optionalString optionalInt optionalFloat optionalBoolean } }", + name: "Should create an execution plan for a query with multiple aliases for the same field in union fragments", + query: `query { randomSearchResult { ... on Product { id name1: name name2: name price1: price price2: price } ... on User { id name1: name name2: name } ... on Category { id name1: name name2: name kind1: kind kind2: kind } } }`, expectedPlan: &RPCExecutionPlan{ Calls: []RPCCall{ { ServiceName: "Products", - MethodName: "QueryNullableFieldsType", + MethodName: "QueryRandomSearchResult", Request: RPCMessage{ - Name: "QueryNullableFieldsTypeRequest", + Name: "QueryRandomSearchResultRequest", }, Response: RPCMessage{ - Name: "QueryNullableFieldsTypeResponse", - Fields: []RPCField{ + Name: "QueryRandomSearchResultResponse", + Fields: RPCFields{ { - Name: "nullable_fields_type", + Name: "random_search_result", TypeName: string(DataTypeMessage), - JSONPath: "nullableFieldsType", + JSONPath: "randomSearchResult", Message: &RPCMessage{ - Name: "NullableFieldsType", - Fields: []RPCField{ - { - Name: "optional_string", - TypeName: string(DataTypeString), - JSONPath: "optionalString", - Optional: true, - }, - { - Name: "optional_int", - TypeName: string(DataTypeInt32), - JSONPath: "optionalInt", - Optional: true, + Name: "SearchResult", + OneOfType: OneOfTypeUnion, + MemberTypes: []string{ + "Product", + "User", + "Category", + }, + Fields: RPCFields{}, + FieldSelectionSet: RPCFieldSelectionSet{ + "Product": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name1", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name2", + }, + { + Name: "price", + TypeName: string(DataTypeDouble), + JSONPath: "price", + Alias: "price1", + }, + { + Name: "price", + TypeName: string(DataTypeDouble), + JSONPath: "price", + Alias: "price2", + }, }, - { - Name: "optional_float", - TypeName: string(DataTypeDouble), - JSONPath: "optionalFloat", - Optional: true, + "User": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name1", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name2", + }, }, - { - Name: "optional_boolean", - TypeName: string(DataTypeBool), - JSONPath: "optionalBoolean", - Optional: true, + "Category": { + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name1", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + Alias: "name2", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + Alias: "kind1", + EnumName: "CategoryKind", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + Alias: "kind2", + EnumName: "CategoryKind", + }, }, }, }, @@ -4301,11 +2423,48 @@ func TestNullableFieldsExecutionPlan(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Parallel() - runTest(t, testCase{ - query: tt.query, - expectedPlan: tt.expectedPlan, - expectedError: tt.expectedError, - }) + report := &operationreport.Report{} + // Parse the GraphQL schema + schemaDoc := grpctest.MustGraphQLSchema(t) + + astvalidation.DefaultDefinitionValidator().Validate(&schemaDoc, report) + if report.HasErrors() { + t.Fatalf("failed to validate schema: %s", report.Error()) + } + + // Parse the GraphQL query + queryDoc, queryReport := astparser.ParseGraphqlDocumentString(tt.query) + if queryReport.HasErrors() { + t.Fatalf("failed to parse query: %s", queryReport.Error()) + } + + astvalidation.DefaultOperationValidator().Validate(&queryDoc, &schemaDoc, report) + if report.HasErrors() { + t.Fatalf("failed to validate query: %s", report.Error()) + } + + planner := NewPlanner("Products", testMapping()) + outPlan, err := planner.PlanOperation(&queryDoc, &schemaDoc) + + if tt.expectedError != "" { + if err == nil { + t.Fatalf("expected error, got nil") + } + if !strings.Contains(err.Error(), tt.expectedError) { + t.Fatalf("expected error to contain %q, got %q", tt.expectedError, err.Error()) + } + return + } + + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + + diff := cmp.Diff(tt.expectedPlan, outPlan) + if diff != "" { + t.Fatalf("execution plan mismatch: %s", diff) + } }) } + } diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go index 98fbc97edb..560eee8b08 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go @@ -324,18 +324,49 @@ func (r *rpcPlanVisitor) EnterField(ref int) { return } + field := r.buildField(fd, fieldName, fieldAlias) + + if ref, ok := r.IsInlineFragmentField(); ok && !r.planInfo.isEntityLookup { + if r.planInfo.currentResponseMessage.FieldSelectionSet == nil { + r.planInfo.currentResponseMessage.FieldSelectionSet = make(RPCFieldSelectionSet) + } + + inlineFragmentName := r.operation.InlineFragmentTypeConditionNameString(ref) + r.planInfo.currentResponseMessage.FieldSelectionSet.Add(inlineFragmentName, field) + return + } + + r.planInfo.currentResponseMessage.Fields = append(r.planInfo.currentResponseMessage.Fields, field) +} + +// buildField builds a field from a field definition. +// It handles lists, enums, and other types. +func (r *rpcPlanVisitor) buildField(fd int, fieldName, fieldAlias string) RPCField { fdt := r.definition.FieldDefinitionType(fd) typeName := r.toDataType(&r.definition.Types[fdt]) - parentTypeName := r.walker.EnclosingTypeDefinition.NameString(r.definition) field := RPCField{ Name: r.resolveFieldMapping(parentTypeName, fieldName), - TypeName: typeName.String(), - JSONPath: fieldName, - Repeated: r.definition.TypeIsList(fdt), Alias: fieldAlias, Optional: !r.definition.TypeIsNonNull(fdt), + JSONPath: fieldName, + TypeName: typeName.String(), + } + + if r.definition.TypeIsList(fdt) { + switch { + // for nullable or nested lists we need to build a wrapper message + // Nullability is handled by the datasource during the execution. + case r.typeIsNullableOrNestedList(fdt): + field.ListMetadata = r.createListMetadata(fdt, r.definition.ResolveTypeNameString(fdt)) + field.TypeName = DataTypeMessage.String() + field.IsListType = true + default: + // For non-nullable single lists we can directly use the repeated syntax in protobuf. + field.Repeated = true + field.TypeName = typeName.String() + } } if typeName == DataTypeEnum { @@ -346,17 +377,7 @@ func (r *rpcPlanVisitor) EnterField(ref int) { field.StaticValue = parentTypeName } - if ref, ok := r.IsInlineFragmentField(); ok && !r.planInfo.isEntityLookup { - if r.planInfo.currentResponseMessage.FieldSelectionSet == nil { - r.planInfo.currentResponseMessage.FieldSelectionSet = make(RPCFieldSelectionSet) - } - - inlineFragmentName := r.operation.InlineFragmentTypeConditionNameString(ref) - r.planInfo.currentResponseMessage.FieldSelectionSet.Add(inlineFragmentName, field) - return - } - - r.planInfo.currentResponseMessage.Fields = append(r.planInfo.currentResponseMessage.Fields, field) + return field } // LeaveField implements astvisitor.FieldVisitor. @@ -435,7 +456,7 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i TypeName: DataTypeMessage.String(), JSONPath: jsonPath, Message: msg, - Repeated: r.definition.TypeIsList(typeRef), + Repeated: r.typeIsNonNullList(typeRef), }) // Add the current request message to the ancestors and set the current request message to the new message. @@ -450,10 +471,7 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i case ast.NodeKindScalarTypeDefinition, ast.NodeKindEnumTypeDefinition: rootNode := r.walker.TypeDefinitions[len(r.walker.TypeDefinitions)-2] baseType := r.definition.NodeNameString(rootNode) - dt := DataTypeMessage - if !r.typeIsNullableOrNestedList(typeRef) { - dt = r.toDataType(&r.definition.Types[typeRef]) - } + dt := r.toDataType(&r.definition.Types[typeRef]) field := RPCField{ Name: r.resolveInputArgument(baseType, r.walker.Ancestor().Ref, fieldName), @@ -461,7 +479,15 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i JSONPath: jsonPath, Repeated: r.typeIsNonNullList(typeRef), Optional: !r.definition.TypeIsNonNull(typeRef), - Message: r.buildListMessage(typeRef, baseType, fieldName), + } + + // For nullable or nested lists we need to build a wrapper message + if r.typeIsNullableOrNestedList(typeRef) { + field.JSONPath = "" + field.Message = r.buildListMessage(typeRef, baseType, fieldName) + field.TypeName = DataTypeMessage.String() + field.Repeated = false + field.IsListType = true } if dt == DataTypeEnum { @@ -481,15 +507,31 @@ func (r *rpcPlanVisitor) typeIsNonNullList(typeRef int) bool { return r.definition.TypeIsList(typeRef) && r.definition.TypeIsNonNull(typeRef) } -func (r *rpcPlanVisitor) buildListMessage(typeRef int, graphqlTypeName, jsonPath string) *RPCMessage { - // We only need to build a wrapper message when we are dealing with nullable or nested lists. - if !r.definition.TypeIsList(typeRef) || r.definition.TypeIsNonNull(typeRef) { - return nil +func (r *rpcPlanVisitor) createListMetadata(typeRef int, graphqlTypeName string) *ListMetadata { + nestingLevel := r.definition.TypeNumberOfListWraps(typeRef) + + md := &ListMetadata{ + ItemTypeName: graphqlTypeName, + NestingLevel: nestingLevel, + LevelInfo: make([]ListMetadataItem, nestingLevel), } - dataType := r.toDataType(&r.definition.Types[typeRef]) + for i := 0; i < nestingLevel; i++ { + md.LevelInfo[i] = ListMetadataItem{ + Optional: !r.definition.TypeIsNonNull(typeRef), + } + + typeRef = r.unwrapListNesting(typeRef) + } + + return md +} + +func (r *rpcPlanVisitor) buildListMessage(typeRef int, graphqlTypeName, jsonPath string) *RPCMessage { nestingLevel := r.definition.TypeNumberOfListWraps(typeRef) + dataType := r.toDataType(&r.definition.Types[typeRef]) + rootMessage := &RPCMessage{} currentMessage := rootMessage for i := nestingLevel; i > 0; i-- { @@ -582,21 +624,24 @@ func (r *rpcPlanVisitor) buildMessageField(fieldName string, typeRef, parentType // If the type is not an object, directly add the field to the request message // TODO: check interfaces, unions, etc. if underlyingTypeNode.Kind != ast.NodeKindInputObjectTypeDefinition { + + dt := r.toDataType(&inputValueDefinitionType) field := RPCField{ Name: r.resolveFieldMapping(parentTypeName, fieldName), Repeated: r.typeIsNonNullList(typeRef), Optional: !r.definition.TypeIsNonNull(typeRef), - Message: r.buildListMessage(typeRef, underlyingTypeName, fieldName), + TypeName: dt.String(), + JSONPath: fieldName, } - dt := DataTypeMessage - if !r.typeIsNullableOrNestedList(typeRef) { - field.JSONPath = fieldName - dt = r.toDataType(&inputValueDefinitionType) + if r.typeIsNullableOrNestedList(typeRef) { + field.JSONPath = "" + field.Message = r.buildListMessage(typeRef, underlyingTypeName, fieldName) + field.TypeName = DataTypeMessage.String() + field.Repeated = false + field.IsListType = true } - field.TypeName = dt.String() - if dt == DataTypeEnum { field.EnumName = underlyingTypeName } @@ -611,6 +656,7 @@ func (r *rpcPlanVisitor) buildMessageField(fieldName string, typeRef, parentType } // TODO in case of a list make sure the message ancestor is the last message in the list + r.planInfo.currentRequestMessage.Fields = append(r.planInfo.currentRequestMessage.Fields, RPCField{ Name: r.resolveFieldMapping(parentTypeName, fieldName), TypeName: DataTypeMessage.String(), diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go index 358ff18248..06636bbfa3 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go @@ -221,6 +221,17 @@ func (d *DataSource) marshalResponseJSON(arena *astjson.Arena, message *RPCMessa continue } + if field.IsListType { + arr, err := d.flattenListStructure(arena, field.ListMetadata, msg, field.Message) + if err != nil { + return nil, err + } + + root.Set(field.AliasOrPath(), arr) + + continue + } + if field.Optional { err := d.resolveOptionalField(arena, root, field.JSONPath, msg) if err != nil { @@ -253,10 +264,92 @@ func (d *DataSource) marshalResponseJSON(arena *astjson.Arena, message *RPCMessa return root, nil } +/* + message ListOfListOfString { + message List { + repeated ListOfString items = 1; + } + List list = 1; + } + + message ListOfString { + repeated string items = 1; + } +*/ +func (d *DataSource) flattenListStructure(arena *astjson.Arena, md *ListMetadata, data protoref.Message, message *RPCMessage) (*astjson.Value, error) { + if md == nil { + return arena.NewNull(), fmt.Errorf("unable to flatten list structure: list metadata not found") + } + + root := arena.NewArray() + return d.traverseList(0, arena, root, md, data, message) +} + +func (d *DataSource) traverseList(level int, arena *astjson.Arena, current *astjson.Value, md *ListMetadata, data protoref.Message, message *RPCMessage) (*astjson.Value, error) { + if level > md.NestingLevel { + return current, nil + } + + // List wrappers always use field number 1 + fd := data.Descriptor().Fields().ByNumber(1) + if fd == nil { + return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field with number %d not found in message %q", 1, data.Descriptor().Name()) + } + + if level < md.NestingLevel-1 { + if fd.Kind() != protoref.MessageKind { + return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field %q is not a message", fd.Name()) + } + + msg := data.Get(fd).Message() + if !msg.IsValid() { + if md.LevelInfo[level].Optional { + return arena.NewNull(), nil + } + + return arena.NewNull(), fmt.Errorf("unable to flatten list structure: message %q is invalid", data.Descriptor().Name()) + } + + fd = msg.Descriptor().Fields().ByNumber(1) + if !fd.IsList() { + return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field %q is not a list", fd.Name()) + } + + list := msg.Get(fd).List() + for i := 0; i < list.Len(); i++ { + next := arena.NewArray() + val, err := d.traverseList(level+1, arena, next, md, list.Get(i).Message(), message) + if err != nil { + return nil, err + } + + current.SetArrayItem(i, val) + } + + return current, nil + } + + list := data.Get(fd).List() + for i := 0; i < list.Len(); i++ { + if message != nil { + val, err := d.marshalResponseJSON(arena, message, list.Get(i).Message()) + if err != nil { + return nil, err + } + + current.SetArrayItem(i, val) + } else { + d.setArrayItem(i, arena, current, list.Get(i), fd) + } + } + + return current, nil +} + func (d *DataSource) resolveOptionalField(arena *astjson.Arena, root *astjson.Value, name string, data protoref.Message) error { fd := data.Descriptor().Fields().ByName(protoref.Name("value")) if fd == nil { - return fmt.Errorf("unable to resolve optional field: field value not found in message %s", data.Descriptor().Name()) + return fmt.Errorf("unable to resolve optional field: field %q not found in message %s", "value", data.Descriptor().Name()) } d.setJSONValue(arena, root, name, data, fd) diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go index a99654c1a9..67fc18c3db 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go @@ -2084,3 +2084,548 @@ func Test_DataSource_Load_WithNullableFieldsType(t *testing.T) { }) } } + +func Test_DataSource_Load_WithNestedLists(t *testing.T) { + conn, cleanup := setupTestGRPCServer(t) + defer cleanup() + + testCases := []struct { + name string + query string + vars string + validate func(t *testing.T, data map[string]interface{}) + }{ + { + name: "Should handle BlogPost with single lists of different nullability", + query: `query { + blogPost { + id + title + content + tags + optionalTags + categories + keywords + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + blogPost, ok := data["blogPost"].(map[string]interface{}) + require.True(t, ok, "blogPost should be an object") + + // Check required fields + require.NotEmpty(t, blogPost["id"]) + require.NotEmpty(t, blogPost["title"]) + require.NotEmpty(t, blogPost["content"]) + + // Check required list with required items + tags, ok := blogPost["tags"].([]interface{}) + require.True(t, ok, "tags should be an array") + require.NotEmpty(t, tags, "tags should not be empty") + + // Check optional list with required items (can be null or array) + if optionalTags := blogPost["optionalTags"]; optionalTags != nil { + optionalTagsArr, ok := optionalTags.([]interface{}) + require.True(t, ok, "optionalTags should be an array if present") + require.NotEmpty(t, optionalTagsArr, "optionalTags should not be empty if present") + } + + // Check required list with optional items + _, ok = blogPost["categories"].([]interface{}) + require.True(t, ok, "categories should be an array") + // categories can contain null items + + // Check optional list with optional items (can be null or array) + if keywords := blogPost["keywords"]; keywords != nil { + _, ok := keywords.([]interface{}) + require.True(t, ok, "keywords should be an array if present") + // keywords array can contain null items + } + }, + }, + { + name: "Should handle BlogPost with scalar type lists", + query: `query { + blogPost { + id + title + viewCounts + ratings + isPublished + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + blogPost, ok := data["blogPost"].(map[string]interface{}) + require.True(t, ok, "blogPost should be an object") + + // Check required list of required ints + viewCounts, ok := blogPost["viewCounts"].([]interface{}) + require.True(t, ok, "viewCounts should be an array") + require.NotEmpty(t, viewCounts, "viewCounts should not be empty") + for _, count := range viewCounts { + require.IsType(t, float64(0), count, "viewCounts items should be numbers") + } + + // Check optional list of optional floats + if ratings := blogPost["ratings"]; ratings != nil { + _, ok := ratings.([]interface{}) + require.True(t, ok, "ratings should be an array if present") + // ratings can contain null values + } + + // Check optional list of required booleans + if isPublished := blogPost["isPublished"]; isPublished != nil { + isPublishedArr, ok := isPublished.([]interface{}) + require.True(t, ok, "isPublished should be an array if present") + for _, published := range isPublishedArr { + require.IsType(t, true, published, "isPublished items should be booleans") + } + } + }, + }, + { + name: "Should handle BlogPost with nested lists", + query: `query { + blogPost { + id + title + tagGroups + relatedTopics + commentThreads + suggestions + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + blogPost, ok := data["blogPost"].(map[string]interface{}) + require.True(t, ok, "blogPost should be an object") + + // Check required list of required lists with required items + tagGroups, ok := blogPost["tagGroups"].([]interface{}) + require.True(t, ok, "tagGroups should be an array") + require.NotEmpty(t, tagGroups, "tagGroups should not be empty") + for _, group := range tagGroups { + groupArr, ok := group.([]interface{}) + require.True(t, ok, "tagGroups items should be arrays") + require.NotEmpty(t, groupArr, "tagGroups inner arrays should not be empty") + for _, tag := range groupArr { + require.IsType(t, "", tag, "tags should be strings") + } + } + + // Check required list of optional lists with required items + _, ok = blogPost["relatedTopics"].([]interface{}) + require.True(t, ok, "relatedTopics should be an array") + // relatedTopics can contain null inner arrays + + // Check required list of required lists with optional items + commentThreads, ok := blogPost["commentThreads"].([]interface{}) + require.True(t, ok, "commentThreads should be an array") + require.NotEmpty(t, commentThreads, "commentThreads should not be empty") + for _, thread := range commentThreads { + _, ok := thread.([]interface{}) + require.True(t, ok, "commentThreads items should be arrays") + for _, item := range thread.([]interface{}) { + require.IsType(t, "", item, "commentThreads items should be strings") + } + } + + // Check optional list of optional lists with optional items + if suggestions := blogPost["suggestions"]; suggestions != nil { + _, ok := suggestions.([]interface{}) + require.True(t, ok, "suggestions should be an array if present") + for _, suggestion := range suggestions.([]interface{}) { + _, ok := suggestion.([]interface{}) + require.True(t, ok, "suggestions items should be arrays") + } + } + }, + }, + { + name: "Should handle Author with single lists", + query: `query { + author { + id + name + email + skills + languages + socialLinks + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + author, ok := data["author"].(map[string]interface{}) + require.True(t, ok, "author should be an object") + + // Check required fields + require.NotEmpty(t, author["id"]) + require.NotEmpty(t, author["name"]) + + // Check required list with required items + skills, ok := author["skills"].([]interface{}) + require.True(t, ok, "skills should be an array") + require.NotEmpty(t, skills, "skills should not be empty") + + // Check required list with optional items + _, ok = author["languages"].([]interface{}) + require.True(t, ok, "languages should be an array") + // languages can contain null items + + // Check optional list with optional items + if socialLinks := author["socialLinks"]; socialLinks != nil { + _, ok := socialLinks.([]interface{}) + require.True(t, ok, "socialLinks should be an array if present") + // socialLinks can contain null items + } + }, + }, + { + name: "Should handle Author with nested lists", + query: `query { + author { + id + name + teamsByProject + collaborations + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + author, ok := data["author"].(map[string]interface{}) + require.True(t, ok, "author should be an object") + + // Check required list of required lists with required items + teamsByProject, ok := author["teamsByProject"].([]interface{}) + require.True(t, ok, "teamsByProject should be an array") + require.NotEmpty(t, teamsByProject, "teamsByProject should not be empty") + for _, project := range teamsByProject { + projectArr, ok := project.([]interface{}) + require.True(t, ok, "teamsByProject items should be arrays") + require.NotEmpty(t, projectArr, "teamsByProject inner arrays should not be empty") + for _, member := range projectArr { + require.IsType(t, "", member, "team members should be strings") + } + } + + // Check optional list of optional lists with optional items + if collaborations := author["collaborations"]; collaborations != nil { + _, ok := collaborations.([]interface{}) + require.True(t, ok, "collaborations should be an array if present") + // collaborations can contain null inner arrays and null items + } + }, + }, + { + name: "Should handle BlogPost query by ID", + query: `query { + blogPostById(id: "test-blog-1") { + id + title + content + tags + tagGroups + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + blogPost, ok := data["blogPostById"].(map[string]interface{}) + require.True(t, ok, "blogPostById should be an object") + require.Equal(t, "test-blog-1", blogPost["id"]) + require.NotEmpty(t, blogPost["title"]) + require.NotEmpty(t, blogPost["tags"]) + require.NotEmpty(t, blogPost["tagGroups"]) + }, + }, + { + name: "Should handle Author query by ID", + query: `query { + authorById(id: "test-author-1") { + id + name + skills + teamsByProject + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + author, ok := data["authorById"].(map[string]interface{}) + require.True(t, ok, "authorById should be an object") + require.Equal(t, "test-author-1", author["id"]) + require.NotEmpty(t, author["name"]) + require.NotEmpty(t, author["skills"]) + require.NotEmpty(t, author["teamsByProject"]) + }, + }, + { + name: "Should handle BlogPost filtered query", + query: `query { + blogPostsWithFilter(filter: { title: "Test", hasCategories: true, minTags: 2 }) { + id + title + tags + categories + tagGroups + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + blogPosts, ok := data["blogPostsWithFilter"].([]interface{}) + require.True(t, ok, "blogPostsWithFilter should be an array") + require.NotEmpty(t, blogPosts, "blogPostsWithFilter should not be empty") + + for _, post := range blogPosts { + blogPost, ok := post.(map[string]interface{}) + require.True(t, ok, "each post should be an object") + require.NotEmpty(t, blogPost["id"]) + require.NotEmpty(t, blogPost["title"]) + require.NotEmpty(t, blogPost["tags"]) + require.NotEmpty(t, blogPost["categories"]) + require.NotEmpty(t, blogPost["tagGroups"]) + } + }, + }, + { + name: "Should handle Author filtered query", + query: `query { + authorsWithFilter(filter: { name: "Test", hasTeams: true, skillCount: 3 }) { + id + name + skills + teamsByProject + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + authors, ok := data["authorsWithFilter"].([]interface{}) + require.True(t, ok, "authorsWithFilter should be an array") + require.NotEmpty(t, authors, "authorsWithFilter should not be empty") + + for _, auth := range authors { + author, ok := auth.(map[string]interface{}) + require.True(t, ok, "each author should be an object") + require.NotEmpty(t, author["id"]) + require.NotEmpty(t, author["name"]) + require.NotEmpty(t, author["skills"]) + require.NotEmpty(t, author["teamsByProject"]) + } + }, + }, + { + name: "Should handle BlogPost creation mutation", + query: `mutation { + createBlogPost(input: { + title: "New Blog Post" + content: "Content here" + tags: ["tech", "programming"] + optionalTags: ["optional1", "optional2"] + categories: ["Technology", "Programming"] + keywords: ["keyword1", "keyword2"] + viewCounts: [100, 200, 300] + ratings: [4.5, 5.0, 3.8] + isPublished: [true, false, true] + tagGroups: [["tech", "go"], ["programming", "backend"]] + relatedTopics: [["topic1", "topic2"], ["topic3"]] + commentThreads: [["comment1", "comment2"], ["comment3", "comment4"]] + suggestions: [["suggestion1"], ["suggestion2", "suggestion3"]] + }) { + id + title + content + tags + optionalTags + tagGroups + relatedTopics + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + createBlogPost, ok := data["createBlogPost"].(map[string]interface{}) + require.True(t, ok, "createBlogPost should be an object") + require.NotEmpty(t, createBlogPost["id"]) + require.Equal(t, "New Blog Post", createBlogPost["title"]) + require.Equal(t, "Content here", createBlogPost["content"]) + + // Verify lists + tags, ok := createBlogPost["tags"].([]interface{}) + require.True(t, ok, "tags should be an array") + require.Contains(t, tags, "tech") + require.Contains(t, tags, "programming") + + optionalTags, ok := createBlogPost["optionalTags"].([]interface{}) + require.True(t, ok, "optionalTags should be an array") + require.Contains(t, optionalTags, "optional1") + require.Contains(t, optionalTags, "optional2") + + // Verify nested lists + tagGroups, ok := createBlogPost["tagGroups"].([]interface{}) + require.True(t, ok, "tagGroups should be an array") + require.Len(t, tagGroups, 2) + + relatedTopics, ok := createBlogPost["relatedTopics"].([]interface{}) + require.True(t, ok, "relatedTopics should be an array") + require.Len(t, relatedTopics, 2) + }, + }, + { + name: "Should handle Author creation mutation", + query: `mutation { + createAuthor(input: { + name: "New Author" + email: "author@example.com" + skills: ["Go", "GraphQL", "gRPC"] + languages: ["English", "Spanish"] + socialLinks: ["twitter.com/author", "github.com/author"] + teamsByProject: [["Alice", "Bob"], ["Charlie", "David", "Eve"]] + collaborations: [["Project1", "Project2"], ["Project3"]] + }) { + id + name + email + skills + languages + socialLinks + teamsByProject + collaborations + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + createAuthor, ok := data["createAuthor"].(map[string]interface{}) + require.True(t, ok, "createAuthor should be an object") + require.NotEmpty(t, createAuthor["id"]) + require.Equal(t, "New Author", createAuthor["name"]) + require.Equal(t, "author@example.com", createAuthor["email"]) + + // Verify single lists + skills, ok := createAuthor["skills"].([]interface{}) + require.True(t, ok, "skills should be an array") + require.Contains(t, skills, "Go") + require.Contains(t, skills, "GraphQL") + require.Contains(t, skills, "gRPC") + + languages, ok := createAuthor["languages"].([]interface{}) + require.True(t, ok, "languages should be an array") + require.Contains(t, languages, "English") + require.Contains(t, languages, "Spanish") + + socialLinks, ok := createAuthor["socialLinks"].([]interface{}) + require.True(t, ok, "socialLinks should be an array") + require.Contains(t, socialLinks, "twitter.com/author") + require.Contains(t, socialLinks, "github.com/author") + + // Verify nested lists + teamsByProject, ok := createAuthor["teamsByProject"].([]interface{}) + require.True(t, ok, "teamsByProject should be an array") + require.Len(t, teamsByProject, 2) + + collaborations, ok := createAuthor["collaborations"].([]interface{}) + require.True(t, ok, "collaborations should be an array") + require.Len(t, collaborations, 2) + }, + }, + { + name: "Should handle all BlogPosts query", + query: `query { + allBlogPosts { + id + title + tags + tagGroups + viewCounts + ratings + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + allBlogPosts, ok := data["allBlogPosts"].([]interface{}) + require.True(t, ok, "allBlogPosts should be an array") + require.NotEmpty(t, allBlogPosts, "allBlogPosts should not be empty") + + for _, post := range allBlogPosts { + blogPost, ok := post.(map[string]interface{}) + require.True(t, ok, "each post should be an object") + require.NotEmpty(t, blogPost["id"]) + require.NotEmpty(t, blogPost["title"]) + require.NotEmpty(t, blogPost["tags"]) + } + }, + }, + { + name: "Should handle all Authors query", + query: `query { + allAuthors { + id + name + skills + teamsByProject + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + allAuthors, ok := data["allAuthors"].([]interface{}) + require.True(t, ok, "allAuthors should be an array") + require.NotEmpty(t, allAuthors, "allAuthors should not be empty") + + for _, auth := range allAuthors { + author, ok := auth.(map[string]interface{}) + require.True(t, ok, "each author should be an object") + require.NotEmpty(t, author["id"]) + require.NotEmpty(t, author["name"]) + require.NotEmpty(t, author["skills"]) + } + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Parse the GraphQL schema + schemaDoc := grpctest.MustGraphQLSchema(t) + + // Parse the GraphQL query + queryDoc, report := astparser.ParseGraphqlDocumentString(tc.query) + if report.HasErrors() { + t.Fatalf("failed to parse query: %s", report.Error()) + } + + compiler, err := NewProtoCompiler(grpctest.MustProtoSchema(t), testMapping()) + if err != nil { + t.Fatalf("failed to compile proto: %v", err) + } + + // Create the datasource + ds, err := NewDataSource(conn, DataSourceConfig{ + Operation: &queryDoc, + Definition: &schemaDoc, + SubgraphName: "Products", + Mapping: testMapping(), + Compiler: compiler, + }) + require.NoError(t, err) + + // Execute the query through our datasource + output := new(bytes.Buffer) + input := fmt.Sprintf(`{"query":%q,"body":%s}`, tc.query, tc.vars) + err = ds.Load(context.Background(), []byte(input), output) + require.NoError(t, err) + + // Parse the response + var resp struct { + Data map[string]interface{} `json:"data"` + Errors []struct { + Message string `json:"message"` + } `json:"errors,omitempty"` + } + + err = json.Unmarshal(output.Bytes(), &resp) + require.NoError(t, err, "Failed to unmarshal response") + require.Empty(t, resp.Errors, "Response should not contain errors") + require.NotEmpty(t, resp.Data, "Response should contain data") + + // Run the validation function + tc.validate(t, resp.Data) + }) + } +} diff --git a/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go b/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go index 8149103b12..a5e728d6bf 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go +++ b/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go @@ -104,6 +104,46 @@ func testMapping() *GRPCMapping { Request: "QueryAllNullableFieldsTypesRequest", Response: "QueryAllNullableFieldsTypesResponse", }, + "blogPost": { + RPC: "QueryBlogPost", + Request: "QueryBlogPostRequest", + Response: "QueryBlogPostResponse", + }, + "blogPostById": { + RPC: "QueryBlogPostById", + Request: "QueryBlogPostByIdRequest", + Response: "QueryBlogPostByIdResponse", + }, + "blogPostsWithFilter": { + RPC: "QueryBlogPostsWithFilter", + Request: "QueryBlogPostsWithFilterRequest", + Response: "QueryBlogPostsWithFilterResponse", + }, + "allBlogPosts": { + RPC: "QueryAllBlogPosts", + Request: "QueryAllBlogPostsRequest", + Response: "QueryAllBlogPostsResponse", + }, + "author": { + RPC: "QueryAuthor", + Request: "QueryAuthorRequest", + Response: "QueryAuthorResponse", + }, + "authorById": { + RPC: "QueryAuthorById", + Request: "QueryAuthorByIdRequest", + Response: "QueryAuthorByIdResponse", + }, + "authorsWithFilter": { + RPC: "QueryAuthorsWithFilter", + Request: "QueryAuthorsWithFilterRequest", + Response: "QueryAuthorsWithFilterResponse", + }, + "allAuthors": { + RPC: "QueryAllAuthors", + Request: "QueryAllAuthorsRequest", + Response: "QueryAllAuthorsResponse", + }, }, MutationRPCs: RPCConfigMap{ "createUser": { @@ -126,6 +166,26 @@ func testMapping() *GRPCMapping { Request: "MutationUpdateNullableFieldsTypeRequest", Response: "MutationUpdateNullableFieldsTypeResponse", }, + "createBlogPost": { + RPC: "MutationCreateBlogPost", + Request: "MutationCreateBlogPostRequest", + Response: "MutationCreateBlogPostResponse", + }, + "updateBlogPost": { + RPC: "MutationUpdateBlogPost", + Request: "MutationUpdateBlogPostRequest", + Response: "MutationUpdateBlogPostResponse", + }, + "createAuthor": { + RPC: "MutationCreateAuthor", + Request: "MutationCreateAuthorRequest", + Response: "MutationCreateAuthorResponse", + }, + "updateAuthor": { + RPC: "MutationUpdateAuthor", + Request: "MutationUpdateAuthorRequest", + Response: "MutationUpdateAuthorResponse", + }, }, SubscriptionRPCs: RPCConfigMap{}, EntityRPCs: map[string]EntityRPCConfig{ @@ -247,6 +307,42 @@ func testMapping() *GRPCMapping { "allNullableFieldsTypes": { TargetName: "all_nullable_fields_types", }, + "blogPost": { + TargetName: "blog_post", + }, + "blogPostById": { + TargetName: "blog_post_by_id", + ArgumentMappings: map[string]string{ + "id": "id", + }, + }, + "blogPostsWithFilter": { + TargetName: "blog_posts_with_filter", + ArgumentMappings: map[string]string{ + "filter": "filter", + }, + }, + "allBlogPosts": { + TargetName: "all_blog_posts", + }, + "author": { + TargetName: "author", + }, + "authorById": { + TargetName: "author_by_id", + ArgumentMappings: map[string]string{ + "id": "id", + }, + }, + "authorsWithFilter": { + TargetName: "authors_with_filter", + ArgumentMappings: map[string]string{ + "filter": "filter", + }, + }, + "allAuthors": { + TargetName: "all_authors", + }, }, "Mutation": { "createUser": { @@ -274,6 +370,32 @@ func testMapping() *GRPCMapping { "input": "input", }, }, + "createBlogPost": { + TargetName: "create_blog_post", + ArgumentMappings: map[string]string{ + "input": "input", + }, + }, + "updateBlogPost": { + TargetName: "update_blog_post", + ArgumentMappings: map[string]string{ + "id": "id", + "input": "input", + }, + }, + "createAuthor": { + TargetName: "create_author", + ArgumentMappings: map[string]string{ + "input": "input", + }, + }, + "updateAuthor": { + TargetName: "update_author", + ArgumentMappings: map[string]string{ + "id": "id", + "input": "input", + }, + }, }, "UserInput": { "name": { @@ -534,6 +656,19 @@ func testMapping() *GRPCMapping { TargetName: "payload", }, }, + "SearchResult": { + "product": { + TargetName: "product", + }, + }, + "ActionResult": { + "actionSuccess": { + TargetName: "action_success", + }, + "actionError": { + TargetName: "action_error", + }, + }, "NullableFieldsType": { "id": { TargetName: "id", @@ -594,6 +729,162 @@ func testMapping() *GRPCMapping { TargetName: "include_nulls", }, }, + "BlogPost": { + "id": { + TargetName: "id", + }, + "title": { + TargetName: "title", + }, + "content": { + TargetName: "content", + }, + "tags": { + TargetName: "tags", + }, + "optionalTags": { + TargetName: "optional_tags", + }, + "categories": { + TargetName: "categories", + }, + "keywords": { + TargetName: "keywords", + }, + "viewCounts": { + TargetName: "view_counts", + }, + "ratings": { + TargetName: "ratings", + }, + "isPublished": { + TargetName: "is_published", + }, + "tagGroups": { + TargetName: "tag_groups", + }, + "relatedTopics": { + TargetName: "related_topics", + }, + "commentThreads": { + TargetName: "comment_threads", + }, + "suggestions": { + TargetName: "suggestions", + }, + }, + "Author": { + "id": { + TargetName: "id", + }, + "name": { + TargetName: "name", + }, + "email": { + TargetName: "email", + }, + "skills": { + TargetName: "skills", + }, + "languages": { + TargetName: "languages", + }, + "socialLinks": { + TargetName: "social_links", + }, + "teamsByProject": { + TargetName: "teams_by_project", + }, + "collaborations": { + TargetName: "collaborations", + }, + }, + "BlogPostInput": { + "title": { + TargetName: "title", + }, + "content": { + TargetName: "content", + }, + "tags": { + TargetName: "tags", + }, + "optionalTags": { + TargetName: "optional_tags", + }, + "categories": { + TargetName: "categories", + }, + "keywords": { + TargetName: "keywords", + }, + "viewCounts": { + TargetName: "view_counts", + }, + "ratings": { + TargetName: "ratings", + }, + "isPublished": { + TargetName: "is_published", + }, + "tagGroups": { + TargetName: "tag_groups", + }, + "relatedTopics": { + TargetName: "related_topics", + }, + "commentThreads": { + TargetName: "comment_threads", + }, + "suggestions": { + TargetName: "suggestions", + }, + }, + "AuthorInput": { + "name": { + TargetName: "name", + }, + "email": { + TargetName: "email", + }, + "skills": { + TargetName: "skills", + }, + "languages": { + TargetName: "languages", + }, + "socialLinks": { + TargetName: "social_links", + }, + "teamsByProject": { + TargetName: "teams_by_project", + }, + "collaborations": { + TargetName: "collaborations", + }, + }, + "BlogPostFilter": { + "title": { + TargetName: "title", + }, + "hasCategories": { + TargetName: "has_categories", + }, + "minTags": { + TargetName: "min_tags", + }, + }, + "AuthorFilter": { + "name": { + TargetName: "name", + }, + "hasTeams": { + TargetName: "has_teams", + }, + "skillCount": { + TargetName: "skill_count", + }, + }, }, } } diff --git a/v2/pkg/grpctest/mapping/mapping.go b/v2/pkg/grpctest/mapping/mapping.go index fe22e10538..da6870384c 100644 --- a/v2/pkg/grpctest/mapping/mapping.go +++ b/v2/pkg/grpctest/mapping/mapping.go @@ -9,7 +9,7 @@ import ( // DefaultGRPCMapping returns a hardcoded default mapping between GraphQL and Protobuf func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { return &grpcdatasource.GRPCMapping{ - Service: "ProductService", + Service: "Products", QueryRPCs: map[string]grpcdatasource.RPCConfig{ "users": { RPC: "QueryUsers", @@ -111,6 +111,46 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { Request: "QueryAllNullableFieldsTypesRequest", Response: "QueryAllNullableFieldsTypesResponse", }, + "blogPost": { + RPC: "QueryBlogPost", + Request: "QueryBlogPostRequest", + Response: "QueryBlogPostResponse", + }, + "blogPostById": { + RPC: "QueryBlogPostById", + Request: "QueryBlogPostByIdRequest", + Response: "QueryBlogPostByIdResponse", + }, + "blogPostsWithFilter": { + RPC: "QueryBlogPostsWithFilter", + Request: "QueryBlogPostsWithFilterRequest", + Response: "QueryBlogPostsWithFilterResponse", + }, + "allBlogPosts": { + RPC: "QueryAllBlogPosts", + Request: "QueryAllBlogPostsRequest", + Response: "QueryAllBlogPostsResponse", + }, + "author": { + RPC: "QueryAuthor", + Request: "QueryAuthorRequest", + Response: "QueryAuthorResponse", + }, + "authorById": { + RPC: "QueryAuthorById", + Request: "QueryAuthorByIdRequest", + Response: "QueryAuthorByIdResponse", + }, + "authorsWithFilter": { + RPC: "QueryAuthorsWithFilter", + Request: "QueryAuthorsWithFilterRequest", + Response: "QueryAuthorsWithFilterResponse", + }, + "allAuthors": { + RPC: "QueryAllAuthors", + Request: "QueryAllAuthorsRequest", + Response: "QueryAllAuthorsResponse", + }, }, MutationRPCs: grpcdatasource.RPCConfigMap{ "createUser": { @@ -133,6 +173,26 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { Request: "MutationUpdateNullableFieldsTypeRequest", Response: "MutationUpdateNullableFieldsTypeResponse", }, + "createBlogPost": { + RPC: "MutationCreateBlogPost", + Request: "MutationCreateBlogPostRequest", + Response: "MutationCreateBlogPostResponse", + }, + "updateBlogPost": { + RPC: "MutationUpdateBlogPost", + Request: "MutationUpdateBlogPostRequest", + Response: "MutationUpdateBlogPostResponse", + }, + "createAuthor": { + RPC: "MutationCreateAuthor", + Request: "MutationCreateAuthorRequest", + Response: "MutationCreateAuthorResponse", + }, + "updateAuthor": { + RPC: "MutationUpdateAuthor", + Request: "MutationUpdateAuthorRequest", + Response: "MutationUpdateAuthorResponse", + }, }, SubscriptionRPCs: grpcdatasource.RPCConfigMap{}, EntityRPCs: map[string]grpcdatasource.EntityRPCConfig{ @@ -254,6 +314,42 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { "allNullableFieldsTypes": { TargetName: "all_nullable_fields_types", }, + "blogPost": { + TargetName: "blog_post", + }, + "blogPostById": { + TargetName: "blog_post_by_id", + ArgumentMappings: map[string]string{ + "id": "id", + }, + }, + "blogPostsWithFilter": { + TargetName: "blog_posts_with_filter", + ArgumentMappings: map[string]string{ + "filter": "filter", + }, + }, + "allBlogPosts": { + TargetName: "all_blog_posts", + }, + "author": { + TargetName: "author", + }, + "authorById": { + TargetName: "author_by_id", + ArgumentMappings: map[string]string{ + "id": "id", + }, + }, + "authorsWithFilter": { + TargetName: "authors_with_filter", + ArgumentMappings: map[string]string{ + "filter": "filter", + }, + }, + "allAuthors": { + TargetName: "all_authors", + }, }, "Mutation": { "createUser": { @@ -281,6 +377,32 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { "input": "input", }, }, + "createBlogPost": { + TargetName: "create_blog_post", + ArgumentMappings: map[string]string{ + "input": "input", + }, + }, + "updateBlogPost": { + TargetName: "update_blog_post", + ArgumentMappings: map[string]string{ + "id": "id", + "input": "input", + }, + }, + "createAuthor": { + TargetName: "create_author", + ArgumentMappings: map[string]string{ + "input": "input", + }, + }, + "updateAuthor": { + TargetName: "update_author", + ArgumentMappings: map[string]string{ + "id": "id", + "input": "input", + }, + }, }, "UserInput": { "name": { @@ -614,6 +736,162 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { TargetName: "include_nulls", }, }, + "BlogPost": { + "id": { + TargetName: "id", + }, + "title": { + TargetName: "title", + }, + "content": { + TargetName: "content", + }, + "tags": { + TargetName: "tags", + }, + "optionalTags": { + TargetName: "optional_tags", + }, + "categories": { + TargetName: "categories", + }, + "keywords": { + TargetName: "keywords", + }, + "viewCounts": { + TargetName: "view_counts", + }, + "ratings": { + TargetName: "ratings", + }, + "isPublished": { + TargetName: "is_published", + }, + "tagGroups": { + TargetName: "tag_groups", + }, + "relatedTopics": { + TargetName: "related_topics", + }, + "commentThreads": { + TargetName: "comment_threads", + }, + "suggestions": { + TargetName: "suggestions", + }, + }, + "Author": { + "id": { + TargetName: "id", + }, + "name": { + TargetName: "name", + }, + "email": { + TargetName: "email", + }, + "skills": { + TargetName: "skills", + }, + "languages": { + TargetName: "languages", + }, + "socialLinks": { + TargetName: "social_links", + }, + "teamsByProject": { + TargetName: "teams_by_project", + }, + "collaborations": { + TargetName: "collaborations", + }, + }, + "BlogPostInput": { + "title": { + TargetName: "title", + }, + "content": { + TargetName: "content", + }, + "tags": { + TargetName: "tags", + }, + "optionalTags": { + TargetName: "optional_tags", + }, + "categories": { + TargetName: "categories", + }, + "keywords": { + TargetName: "keywords", + }, + "viewCounts": { + TargetName: "view_counts", + }, + "ratings": { + TargetName: "ratings", + }, + "isPublished": { + TargetName: "is_published", + }, + "tagGroups": { + TargetName: "tag_groups", + }, + "relatedTopics": { + TargetName: "related_topics", + }, + "commentThreads": { + TargetName: "comment_threads", + }, + "suggestions": { + TargetName: "suggestions", + }, + }, + "AuthorInput": { + "name": { + TargetName: "name", + }, + "email": { + TargetName: "email", + }, + "skills": { + TargetName: "skills", + }, + "languages": { + TargetName: "languages", + }, + "socialLinks": { + TargetName: "social_links", + }, + "teamsByProject": { + TargetName: "teams_by_project", + }, + "collaborations": { + TargetName: "collaborations", + }, + }, + "BlogPostFilter": { + "title": { + TargetName: "title", + }, + "hasCategories": { + TargetName: "has_categories", + }, + "minTags": { + TargetName: "min_tags", + }, + }, + "AuthorFilter": { + "name": { + TargetName: "name", + }, + "hasTeams": { + TargetName: "has_teams", + }, + "skillCount": { + TargetName: "skill_count", + }, + }, }, } } diff --git a/v2/pkg/grpctest/mockservice.go b/v2/pkg/grpctest/mockservice.go index 31b8efd66b..3072324138 100644 --- a/v2/pkg/grpctest/mockservice.go +++ b/v2/pkg/grpctest/mockservice.go @@ -860,3 +860,645 @@ func (s *MockService) QueryCalculateTotals(ctx context.Context, in *productv1.Qu CalculateTotals: calculatedOrders, }, nil } + +// BlogPost query implementations +func (s *MockService) QueryBlogPost(ctx context.Context, in *productv1.QueryBlogPostRequest) (*productv1.QueryBlogPostResponse, error) { + // Return a default blog post with comprehensive list examples + result := &productv1.BlogPost{ + Id: "blog-default", + Title: "Default Blog Post", + Content: "This is a sample blog post content for testing nested lists.", + Tags: []string{"tech", "programming", "go"}, + OptionalTags: &productv1.ListOfString{ + Items: []string{"optional1", "optional2"}, + }, + Categories: []string{"Technology", "", "Programming"}, // includes null/empty + Keywords: &productv1.ListOfString{ + Items: []string{"keyword1", "keyword2"}, + }, + ViewCounts: []int32{100, 150, 200, 250}, + Ratings: &productv1.ListOfFloat{ + Items: []float64{4.5, 3.8, 5.0}, + }, + IsPublished: &productv1.ListOfBoolean{ + Items: []bool{false, true, true}, + }, + TagGroups: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"tech", "programming"}}, + {Items: []string{"golang", "backend"}}, + }, + }, + }, + RelatedTopics: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"microservices", "api"}}, + {Items: []string{"databases", "performance"}}, + }, + }, + }, + CommentThreads: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Great post!", "Very helpful"}}, + {Items: []string{"Could use more examples", "Thanks for sharing"}}, + }, + }, + }, + Suggestions: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Add code examples", "Include diagrams"}}, + }, + }, + }, + } + + return &productv1.QueryBlogPostResponse{ + BlogPost: result, + }, nil +} + +func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.QueryBlogPostByIdRequest) (*productv1.QueryBlogPostByIdResponse, error) { + id := in.GetId() + + // Return null for specific test IDs + if id == "not-found" { + return &productv1.QueryBlogPostByIdResponse{ + BlogPostById: nil, + }, nil + } + + // Create different test data based on ID + var result *productv1.BlogPost + + switch id { + case "simple": + result = &productv1.BlogPost{ + Id: id, + Title: "Simple Post", + Content: "Simple content", + Tags: []string{"simple"}, + Categories: []string{"Basic"}, + ViewCounts: []int32{10}, + TagGroups: &productv1.ListOfListOfString{}, + RelatedTopics: &productv1.ListOfListOfString{}, + CommentThreads: &productv1.ListOfListOfString{}, + } + case "complex": + result = &productv1.BlogPost{ + Id: id, + Title: "Complex Blog Post", + Content: "Complex content with comprehensive lists", + Tags: []string{"complex", "advanced", "detailed"}, + OptionalTags: &productv1.ListOfString{ + Items: []string{"deep-dive", "tutorial"}, + }, + Categories: []string{"Advanced", "Tutorial", "Guide"}, + Keywords: &productv1.ListOfString{ + Items: []string{"advanced", "complex", "comprehensive"}, + }, + ViewCounts: []int32{500, 600, 750, 800, 950}, + Ratings: &productv1.ListOfFloat{ + Items: []float64{4.8, 4.9, 4.7, 5.0}, + }, + IsPublished: &productv1.ListOfBoolean{ + Items: []bool{false, false, true, true}, + }, + TagGroups: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"advanced", "expert"}}, + {Items: []string{"tutorial", "guide", "comprehensive"}}, + {Items: []string{"deep-dive", "detailed"}}, + }, + }, + }, + RelatedTopics: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"architecture", "patterns", "design"}}, + {Items: []string{"optimization", "performance", "scaling"}}, + }, + }, + }, + CommentThreads: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Excellent deep dive!", "Very thorough"}}, + {Items: []string{"Could be longer", "More examples please"}}, + {Items: []string{"Best tutorial I've read", "Thank you!"}}, + }, + }, + }, + Suggestions: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Add video content", "Include interactive examples"}}, + {Items: []string{"Create follow-up posts", "Add Q&A section"}}, + }, + }, + }, + } + default: + // Generic response for any other ID + result = &productv1.BlogPost{ + Id: id, + Title: fmt.Sprintf("Blog Post %s", id), + Content: fmt.Sprintf("Content for blog post %s", id), + Tags: []string{fmt.Sprintf("tag-%s", id), "general"}, + Categories: []string{"General", fmt.Sprintf("Category-%s", id)}, + ViewCounts: []int32{int32(len(id) * 10), int32(len(id) * 20)}, + TagGroups: &productv1.ListOfListOfString{}, + RelatedTopics: &productv1.ListOfListOfString{}, + CommentThreads: &productv1.ListOfListOfString{}, + } + } + + return &productv1.QueryBlogPostByIdResponse{ + BlogPostById: result, + }, nil +} + +func (s *MockService) QueryBlogPostsWithFilter(ctx context.Context, in *productv1.QueryBlogPostsWithFilterRequest) (*productv1.QueryBlogPostsWithFilterResponse, error) { + filter := in.GetFilter() + var results []*productv1.BlogPost + + // If no filter provided, return empty results + if filter == nil { + return &productv1.QueryBlogPostsWithFilterResponse{ + BlogPostsWithFilter: results, + }, nil + } + + titleFilter := "" + if filter.Title != nil { + titleFilter = filter.Title.GetValue() + } + + hasCategories := false + if filter.HasCategories != nil { + hasCategories = filter.HasCategories.GetValue() + } + + minTags := int32(0) + if filter.MinTags != nil { + minTags = filter.MinTags.GetValue() + } + + // Generate filtered results + for i := 1; i <= 3; i++ { + title := fmt.Sprintf("Filtered Post %d", i) + if titleFilter != "" { + title = fmt.Sprintf("%s - Post %d", titleFilter, i) + } + + var tags []string + tagsCount := minTags + int32(i) + for j := int32(0); j < tagsCount; j++ { + tags = append(tags, fmt.Sprintf("tag%d", j+1)) + } + + var categories []string + if hasCategories { + categories = []string{fmt.Sprintf("Category%d", i), "Filtered"} + } + + results = append(results, &productv1.BlogPost{ + Id: fmt.Sprintf("filtered-blog-%d", i), + Title: title, + Content: fmt.Sprintf("Filtered content %d", i), + Tags: tags, + Categories: categories, + ViewCounts: []int32{int32(i * 100)}, + TagGroups: &productv1.ListOfListOfString{}, + RelatedTopics: &productv1.ListOfListOfString{}, + CommentThreads: &productv1.ListOfListOfString{}, + }) + } + + return &productv1.QueryBlogPostsWithFilterResponse{ + BlogPostsWithFilter: results, + }, nil +} + +func (s *MockService) QueryAllBlogPosts(ctx context.Context, in *productv1.QueryAllBlogPostsRequest) (*productv1.QueryAllBlogPostsResponse, error) { + var results []*productv1.BlogPost + + // Create a variety of blog posts + for i := 1; i <= 4; i++ { + var optionalTags *productv1.ListOfString + var keywords *productv1.ListOfString + var ratings *productv1.ListOfFloat + + // Vary the optional fields + if i%2 == 1 { + optionalTags = &productv1.ListOfString{ + Items: []string{fmt.Sprintf("optional%d", i), "common"}, + } + } + + if i%3 == 0 { + keywords = &productv1.ListOfString{ + Items: []string{fmt.Sprintf("keyword%d", i)}, + } + } + + if i%2 == 0 { + ratings = &productv1.ListOfFloat{ + Items: []float64{float64(i) + 0.5, float64(i) + 1.0}, + } + } + + results = append(results, &productv1.BlogPost{ + Id: fmt.Sprintf("blog-%d", i), + Title: fmt.Sprintf("Blog Post %d", i), + Content: fmt.Sprintf("Content for blog post %d", i), + Tags: []string{fmt.Sprintf("tag%d", i), "common"}, + OptionalTags: optionalTags, + Categories: []string{fmt.Sprintf("Category%d", i)}, + Keywords: keywords, + ViewCounts: []int32{int32(i * 100), int32(i * 150)}, + Ratings: ratings, + IsPublished: &productv1.ListOfBoolean{ + Items: []bool{i%2 == 0, true}, + }, + TagGroups: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("group%d", i), "shared"}}, + }, + }, + }, + RelatedTopics: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("topic%d", i)}}, + }, + }, + }, + CommentThreads: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("Comment for post %d", i)}}, + }, + }, + }, + Suggestions: &productv1.ListOfListOfString{}, + }) + } + + return &productv1.QueryAllBlogPostsResponse{ + AllBlogPosts: results, + }, nil +} + +// Author query implementations +func (s *MockService) QueryAuthor(ctx context.Context, in *productv1.QueryAuthorRequest) (*productv1.QueryAuthorResponse, error) { + result := &productv1.Author{ + Id: "author-default", + Name: "Default Author", + Email: &wrapperspb.StringValue{ + Value: "author@example.com", + }, + Skills: []string{"Go", "GraphQL", "Protocol Buffers"}, + Languages: []string{"English", "Spanish", ""}, + SocialLinks: &productv1.ListOfString{ + Items: []string{"https://twitter.com/author", "https://linkedin.com/in/author"}, + }, + TeamsByProject: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Alice", "Bob", "Charlie"}}, + {Items: []string{"David", "Eve"}}, + }, + }, + }, + Collaborations: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Open Source Project A", "Research Paper B"}}, + {Items: []string{"Conference Talk C"}}, + }, + }, + }, + } + + return &productv1.QueryAuthorResponse{ + Author: result, + }, nil +} + +func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAuthorByIdRequest) (*productv1.QueryAuthorByIdResponse, error) { + id := in.GetId() + + // Return null for specific test IDs + if id == "not-found" { + return &productv1.QueryAuthorByIdResponse{ + AuthorById: nil, + }, nil + } + + var result *productv1.Author + + switch id { + case "minimal": + result = &productv1.Author{ + Id: id, + Name: "Minimal Author", + Skills: []string{"Basic"}, + Languages: []string{"English"}, + TeamsByProject: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Solo"}}, + }, + }, + }, + Collaborations: &productv1.ListOfListOfString{}, + } + case "experienced": + result = &productv1.Author{ + Id: id, + Name: "Experienced Author", + Email: &wrapperspb.StringValue{ + Value: "experienced@example.com", + }, + Skills: []string{"Go", "GraphQL", "gRPC", "Microservices", "Kubernetes"}, + Languages: []string{"English", "French", "German"}, + SocialLinks: &productv1.ListOfString{ + Items: []string{ + "https://github.com/experienced", + "https://twitter.com/experienced", + "https://medium.com/@experienced", + }, + }, + TeamsByProject: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Senior Dev 1", "Senior Dev 2", "Tech Lead"}}, + {Items: []string{"Architect", "Principal Engineer"}}, + {Items: []string{"PM", "Designer", "QA Lead"}}, + }, + }, + }, + Collaborations: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Major OSS Project", "Industry Standard", "Research Initiative"}}, + {Items: []string{"Conference Keynote", "Workshop Series"}}, + }, + }, + }, + } + default: + result = &productv1.Author{ + Id: id, + Name: fmt.Sprintf("Author %s", id), + Email: &wrapperspb.StringValue{ + Value: fmt.Sprintf("%s@example.com", id), + }, + Skills: []string{fmt.Sprintf("Skill-%s", id), "General"}, + Languages: []string{"English", fmt.Sprintf("Language-%s", id)}, + TeamsByProject: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("Team-%s", id)}}, + }, + }, + }, + Collaborations: &productv1.ListOfListOfString{}, + } + } + + return &productv1.QueryAuthorByIdResponse{ + AuthorById: result, + }, nil +} + +func (s *MockService) QueryAuthorsWithFilter(ctx context.Context, in *productv1.QueryAuthorsWithFilterRequest) (*productv1.QueryAuthorsWithFilterResponse, error) { + filter := in.GetFilter() + var results []*productv1.Author + + if filter == nil { + return &productv1.QueryAuthorsWithFilterResponse{ + AuthorsWithFilter: results, + }, nil + } + + nameFilter := "" + if filter.Name != nil { + nameFilter = filter.Name.GetValue() + } + + hasTeams := false + if filter.HasTeams != nil { + hasTeams = filter.HasTeams.GetValue() + } + + skillCount := int32(0) + if filter.SkillCount != nil { + skillCount = filter.SkillCount.GetValue() + } + + // Generate filtered results + for i := 1; i <= 3; i++ { + name := fmt.Sprintf("Filtered Author %d", i) + if nameFilter != "" { + name = fmt.Sprintf("%s - Author %d", nameFilter, i) + } + + var skills []string + skillsNeeded := skillCount + int32(i) + for j := int32(0); j < skillsNeeded; j++ { + skills = append(skills, fmt.Sprintf("Skill%d", j+1)) + } + + var teamsByProject *productv1.ListOfListOfString + if hasTeams { + teamsByProject = &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("Team%d", i), "SharedTeam"}}, + }, + }, + } + } else { + teamsByProject = &productv1.ListOfListOfString{} + } + + results = append(results, &productv1.Author{ + Id: fmt.Sprintf("filtered-author-%d", i), + Name: name, + Skills: skills, + Languages: []string{"English", fmt.Sprintf("Lang%d", i)}, + TeamsByProject: teamsByProject, + Collaborations: &productv1.ListOfListOfString{}, + }) + } + + return &productv1.QueryAuthorsWithFilterResponse{ + AuthorsWithFilter: results, + }, nil +} + +func (s *MockService) QueryAllAuthors(ctx context.Context, in *productv1.QueryAllAuthorsRequest) (*productv1.QueryAllAuthorsResponse, error) { + var results []*productv1.Author + + for i := 1; i <= 3; i++ { + var email *wrapperspb.StringValue + var socialLinks *productv1.ListOfString + var collaborations *productv1.ListOfListOfString + + if i%2 == 1 { + email = &wrapperspb.StringValue{ + Value: fmt.Sprintf("author%d@example.com", i), + } + } + + if i%3 == 0 { + socialLinks = &productv1.ListOfString{ + Items: []string{fmt.Sprintf("https://github.com/author%d", i)}, + } + } + + if i == 2 { + collaborations = &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Collaboration A", "Collaboration B"}}, + }, + }, + } + } else { + collaborations = &productv1.ListOfListOfString{} + } + + results = append(results, &productv1.Author{ + Id: fmt.Sprintf("author-%d", i), + Name: fmt.Sprintf("Author %d", i), + Email: email, + Skills: []string{fmt.Sprintf("Skill%d", i), "Common"}, + Languages: []string{"English", fmt.Sprintf("Language%d", i)}, + SocialLinks: socialLinks, + TeamsByProject: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("Team%d", i)}}, + }, + }, + }, + Collaborations: collaborations, + }) + } + + return &productv1.QueryAllAuthorsResponse{ + AllAuthors: results, + }, nil +} + +// BlogPost mutation implementations +func (s *MockService) MutationCreateBlogPost(ctx context.Context, in *productv1.MutationCreateBlogPostRequest) (*productv1.MutationCreateBlogPostResponse, error) { + input := in.GetInput() + + result := &productv1.BlogPost{ + Id: fmt.Sprintf("blog-%d", rand.Intn(1000)), + Title: input.GetTitle(), + Content: input.GetContent(), + Tags: input.GetTags(), + OptionalTags: input.GetOptionalTags(), + Categories: input.GetCategories(), + Keywords: input.GetKeywords(), + ViewCounts: input.GetViewCounts(), + Ratings: input.GetRatings(), + IsPublished: input.GetIsPublished(), + TagGroups: input.GetTagGroups(), + RelatedTopics: input.GetRelatedTopics(), + CommentThreads: input.GetCommentThreads(), + Suggestions: input.GetSuggestions(), + } + + return &productv1.MutationCreateBlogPostResponse{ + CreateBlogPost: result, + }, nil +} + +func (s *MockService) MutationUpdateBlogPost(ctx context.Context, in *productv1.MutationUpdateBlogPostRequest) (*productv1.MutationUpdateBlogPostResponse, error) { + id := in.GetId() + input := in.GetInput() + + if id == "non-existent" { + return &productv1.MutationUpdateBlogPostResponse{ + UpdateBlogPost: nil, + }, nil + } + + result := &productv1.BlogPost{ + Id: id, + Title: input.GetTitle(), + Content: input.GetContent(), + Tags: input.GetTags(), + OptionalTags: input.GetOptionalTags(), + Categories: input.GetCategories(), + Keywords: input.GetKeywords(), + ViewCounts: input.GetViewCounts(), + Ratings: input.GetRatings(), + IsPublished: input.GetIsPublished(), + TagGroups: input.GetTagGroups(), + RelatedTopics: input.GetRelatedTopics(), + CommentThreads: input.GetCommentThreads(), + Suggestions: input.GetSuggestions(), + } + + return &productv1.MutationUpdateBlogPostResponse{ + UpdateBlogPost: result, + }, nil +} + +// Author mutation implementations +func (s *MockService) MutationCreateAuthor(ctx context.Context, in *productv1.MutationCreateAuthorRequest) (*productv1.MutationCreateAuthorResponse, error) { + input := in.GetInput() + + result := &productv1.Author{ + Id: fmt.Sprintf("author-%d", rand.Intn(1000)), + Name: input.GetName(), + Email: input.GetEmail(), + Skills: input.GetSkills(), + Languages: input.GetLanguages(), + SocialLinks: input.GetSocialLinks(), + TeamsByProject: input.GetTeamsByProject(), + Collaborations: input.GetCollaborations(), + } + + return &productv1.MutationCreateAuthorResponse{ + CreateAuthor: result, + }, nil +} + +func (s *MockService) MutationUpdateAuthor(ctx context.Context, in *productv1.MutationUpdateAuthorRequest) (*productv1.MutationUpdateAuthorResponse, error) { + id := in.GetId() + input := in.GetInput() + + if id == "non-existent" { + return &productv1.MutationUpdateAuthorResponse{ + UpdateAuthor: nil, + }, nil + } + + result := &productv1.Author{ + Id: id, + Name: input.GetName(), + Email: input.GetEmail(), + Skills: input.GetSkills(), + Languages: input.GetLanguages(), + SocialLinks: input.GetSocialLinks(), + TeamsByProject: input.GetTeamsByProject(), + Collaborations: input.GetCollaborations(), + } + + return &productv1.MutationUpdateAuthorResponse{ + UpdateAuthor: result, + }, nil +} diff --git a/v2/pkg/grpctest/product.proto b/v2/pkg/grpctest/product.proto index 29c0a6056b..a2360899cb 100644 --- a/v2/pkg/grpctest/product.proto +++ b/v2/pkg/grpctest/product.proto @@ -11,12 +11,24 @@ service ProductService { rpc LookupProductById(LookupProductByIdRequest) returns (LookupProductByIdResponse) {} // Lookup Storage entity by id rpc LookupStorageById(LookupStorageByIdRequest) returns (LookupStorageByIdResponse) {} + rpc MutationCreateAuthor(MutationCreateAuthorRequest) returns (MutationCreateAuthorResponse) {} + rpc MutationCreateBlogPost(MutationCreateBlogPostRequest) returns (MutationCreateBlogPostResponse) {} rpc MutationCreateNullableFieldsType(MutationCreateNullableFieldsTypeRequest) returns (MutationCreateNullableFieldsTypeResponse) {} rpc MutationCreateUser(MutationCreateUserRequest) returns (MutationCreateUserResponse) {} rpc MutationPerformAction(MutationPerformActionRequest) returns (MutationPerformActionResponse) {} + rpc MutationUpdateAuthor(MutationUpdateAuthorRequest) returns (MutationUpdateAuthorResponse) {} + rpc MutationUpdateBlogPost(MutationUpdateBlogPostRequest) returns (MutationUpdateBlogPostResponse) {} rpc MutationUpdateNullableFieldsType(MutationUpdateNullableFieldsTypeRequest) returns (MutationUpdateNullableFieldsTypeResponse) {} + rpc QueryAllAuthors(QueryAllAuthorsRequest) returns (QueryAllAuthorsResponse) {} + rpc QueryAllBlogPosts(QueryAllBlogPostsRequest) returns (QueryAllBlogPostsResponse) {} rpc QueryAllNullableFieldsTypes(QueryAllNullableFieldsTypesRequest) returns (QueryAllNullableFieldsTypesResponse) {} rpc QueryAllPets(QueryAllPetsRequest) returns (QueryAllPetsResponse) {} + rpc QueryAuthor(QueryAuthorRequest) returns (QueryAuthorResponse) {} + rpc QueryAuthorById(QueryAuthorByIdRequest) returns (QueryAuthorByIdResponse) {} + rpc QueryAuthorsWithFilter(QueryAuthorsWithFilterRequest) returns (QueryAuthorsWithFilterResponse) {} + rpc QueryBlogPost(QueryBlogPostRequest) returns (QueryBlogPostResponse) {} + rpc QueryBlogPostById(QueryBlogPostByIdRequest) returns (QueryBlogPostByIdResponse) {} + rpc QueryBlogPostsWithFilter(QueryBlogPostsWithFilterRequest) returns (QueryBlogPostsWithFilterResponse) {} rpc QueryCalculateTotals(QueryCalculateTotalsRequest) returns (QueryCalculateTotalsResponse) {} rpc QueryCategories(QueryCategoriesRequest) returns (QueryCategoriesResponse) {} rpc QueryCategoriesByKind(QueryCategoriesByKindRequest) returns (QueryCategoriesByKindResponse) {} @@ -37,6 +49,24 @@ service ProductService { rpc QueryUsers(QueryUsersRequest) returns (QueryUsersResponse) {} } +// Wrapper message for a list of Boolean. +message ListOfBoolean { + repeated bool items = 1; +} + +// Wrapper message for a list of Float. +message ListOfFloat { + repeated double items = 1; +} + +// Wrapper message for a list of String. +message ListOfListOfString { + message List { + repeated ListOfString items = 1; + } + List list = 1; +} + // Wrapper message for a list of OrderLine. message ListOfOrderLine { repeated OrderLine items = 1; @@ -267,6 +297,66 @@ message QueryAllNullableFieldsTypesRequest { message QueryAllNullableFieldsTypesResponse { repeated NullableFieldsType all_nullable_fields_types = 1; } +// Request message for blogPost operation. +message QueryBlogPostRequest { +} +// Response message for blogPost operation. +message QueryBlogPostResponse { + BlogPost blog_post = 1; +} +// Request message for blogPostById operation. +message QueryBlogPostByIdRequest { + string id = 1; +} +// Response message for blogPostById operation. +message QueryBlogPostByIdResponse { + BlogPost blog_post_by_id = 1; +} +// Request message for blogPostsWithFilter operation. +message QueryBlogPostsWithFilterRequest { + BlogPostFilter filter = 1; +} +// Response message for blogPostsWithFilter operation. +message QueryBlogPostsWithFilterResponse { + repeated BlogPost blog_posts_with_filter = 1; +} +// Request message for allBlogPosts operation. +message QueryAllBlogPostsRequest { +} +// Response message for allBlogPosts operation. +message QueryAllBlogPostsResponse { + repeated BlogPost all_blog_posts = 1; +} +// Request message for author operation. +message QueryAuthorRequest { +} +// Response message for author operation. +message QueryAuthorResponse { + Author author = 1; +} +// Request message for authorById operation. +message QueryAuthorByIdRequest { + string id = 1; +} +// Response message for authorById operation. +message QueryAuthorByIdResponse { + Author author_by_id = 1; +} +// Request message for authorsWithFilter operation. +message QueryAuthorsWithFilterRequest { + AuthorFilter filter = 1; +} +// Response message for authorsWithFilter operation. +message QueryAuthorsWithFilterResponse { + repeated Author authors_with_filter = 1; +} +// Request message for allAuthors operation. +message QueryAllAuthorsRequest { +} +// Response message for allAuthors operation. +message QueryAllAuthorsResponse { + repeated Author all_authors = 1; +} // Request message for createUser operation. message MutationCreateUserRequest { UserInput input = 1; @@ -300,6 +390,40 @@ message MutationUpdateNullableFieldsTypeRequest { message MutationUpdateNullableFieldsTypeResponse { NullableFieldsType update_nullable_fields_type = 1; } +// Request message for createBlogPost operation. +message MutationCreateBlogPostRequest { + BlogPostInput input = 1; +} +// Response message for createBlogPost operation. +message MutationCreateBlogPostResponse { + BlogPost create_blog_post = 1; +} +// Request message for updateBlogPost operation. +message MutationUpdateBlogPostRequest { + string id = 1; + BlogPostInput input = 2; +} +// Response message for updateBlogPost operation. +message MutationUpdateBlogPostResponse { + BlogPost update_blog_post = 1; +} +// Request message for createAuthor operation. +message MutationCreateAuthorRequest { + AuthorInput input = 1; +} +// Response message for createAuthor operation. +message MutationCreateAuthorResponse { + Author create_author = 1; +} +// Request message for updateAuthor operation. +message MutationUpdateAuthorRequest { + string id = 1; + AuthorInput input = 2; +} +// Response message for updateAuthor operation. +message MutationUpdateAuthorResponse { + Author update_author = 1; +} message Product { string id = 1; @@ -412,6 +536,46 @@ message NullableFieldsFilter { google.protobuf.BoolValue include_nulls = 3; } +message BlogPost { + string id = 1; + string title = 2; + string content = 3; + repeated string tags = 4; + ListOfString optional_tags = 5; + repeated string categories = 6; + ListOfString keywords = 7; + repeated int32 view_counts = 8; + ListOfFloat ratings = 9; + ListOfBoolean is_published = 10; + ListOfListOfString tag_groups = 11; + ListOfListOfString related_topics = 12; + ListOfListOfString comment_threads = 13; + ListOfListOfString suggestions = 14; +} + +message BlogPostFilter { + google.protobuf.StringValue title = 1; + google.protobuf.BoolValue has_categories = 2; + google.protobuf.Int32Value min_tags = 3; +} + +message Author { + string id = 1; + string name = 2; + google.protobuf.StringValue email = 3; + repeated string skills = 4; + repeated string languages = 5; + ListOfString social_links = 6; + ListOfListOfString teams_by_project = 7; + ListOfListOfString collaborations = 8; +} + +message AuthorFilter { + google.protobuf.StringValue name = 1; + google.protobuf.BoolValue has_teams = 2; + google.protobuf.Int32Value skill_count = 3; +} + message UserInput { string name = 1; } @@ -438,6 +602,32 @@ message NullableFieldsInput { int32 required_int = 7; } +message BlogPostInput { + string title = 1; + string content = 2; + repeated string tags = 3; + ListOfString optional_tags = 4; + repeated string categories = 5; + ListOfString keywords = 6; + repeated int32 view_counts = 7; + ListOfFloat ratings = 8; + ListOfBoolean is_published = 9; + ListOfListOfString tag_groups = 10; + ListOfListOfString related_topics = 11; + ListOfListOfString comment_threads = 12; + ListOfListOfString suggestions = 13; +} + +message AuthorInput { + string name = 1; + google.protobuf.StringValue email = 2; + repeated string skills = 3; + repeated string languages = 4; + ListOfString social_links = 5; + ListOfListOfString teams_by_project = 6; + ListOfListOfString collaborations = 7; +} + message NestedTypeB { string id = 1; string name = 2; @@ -503,4 +693,9 @@ message ActionSuccess { message ActionError { string message = 1; string code = 2; +} + +message CategoryInput { + string name = 1; + CategoryKind kind = 2; } \ No newline at end of file diff --git a/v2/pkg/grpctest/productv1/product.pb.go b/v2/pkg/grpctest/productv1/product.pb.go index 47f65281a7..8550117854 100644 --- a/v2/pkg/grpctest/productv1/product.pb.go +++ b/v2/pkg/grpctest/productv1/product.pb.go @@ -77,6 +77,141 @@ func (CategoryKind) EnumDescriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{0} } +// Wrapper message for a list of Boolean. +type ListOfBoolean struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []bool `protobuf:"varint,1,rep,packed,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfBoolean) Reset() { + *x = ListOfBoolean{} + mi := &file_product_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfBoolean) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfBoolean) ProtoMessage() {} + +func (x *ListOfBoolean) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfBoolean.ProtoReflect.Descriptor instead. +func (*ListOfBoolean) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{0} +} + +func (x *ListOfBoolean) GetItems() []bool { + if x != nil { + return x.Items + } + return nil +} + +// Wrapper message for a list of Float. +type ListOfFloat struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []float64 `protobuf:"fixed64,1,rep,packed,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfFloat) Reset() { + *x = ListOfFloat{} + mi := &file_product_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfFloat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfFloat) ProtoMessage() {} + +func (x *ListOfFloat) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfFloat.ProtoReflect.Descriptor instead. +func (*ListOfFloat) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{1} +} + +func (x *ListOfFloat) GetItems() []float64 { + if x != nil { + return x.Items + } + return nil +} + +// Wrapper message for a list of String. +type ListOfListOfString struct { + state protoimpl.MessageState `protogen:"open.v1"` + List *ListOfListOfString_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfString) Reset() { + *x = ListOfListOfString{} + mi := &file_product_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfString) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfString) ProtoMessage() {} + +func (x *ListOfListOfString) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfString.ProtoReflect.Descriptor instead. +func (*ListOfListOfString) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{2} +} + +func (x *ListOfListOfString) GetList() *ListOfListOfString_List { + if x != nil { + return x.List + } + return nil +} + // Wrapper message for a list of OrderLine. type ListOfOrderLine struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -87,7 +222,7 @@ type ListOfOrderLine struct { func (x *ListOfOrderLine) Reset() { *x = ListOfOrderLine{} - mi := &file_product_proto_msgTypes[0] + mi := &file_product_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -99,7 +234,7 @@ func (x *ListOfOrderLine) String() string { func (*ListOfOrderLine) ProtoMessage() {} func (x *ListOfOrderLine) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[0] + mi := &file_product_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -112,7 +247,7 @@ func (x *ListOfOrderLine) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOfOrderLine.ProtoReflect.Descriptor instead. func (*ListOfOrderLine) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{0} + return file_product_proto_rawDescGZIP(), []int{3} } func (x *ListOfOrderLine) GetItems() []*OrderLine { @@ -132,7 +267,7 @@ type ListOfString struct { func (x *ListOfString) Reset() { *x = ListOfString{} - mi := &file_product_proto_msgTypes[1] + mi := &file_product_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -144,7 +279,7 @@ func (x *ListOfString) String() string { func (*ListOfString) ProtoMessage() {} func (x *ListOfString) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[1] + mi := &file_product_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -157,7 +292,7 @@ func (x *ListOfString) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOfString.ProtoReflect.Descriptor instead. func (*ListOfString) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{1} + return file_product_proto_rawDescGZIP(), []int{4} } func (x *ListOfString) GetItems() []string { @@ -178,7 +313,7 @@ type LookupProductByIdRequestKey struct { func (x *LookupProductByIdRequestKey) Reset() { *x = LookupProductByIdRequestKey{} - mi := &file_product_proto_msgTypes[2] + mi := &file_product_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -190,7 +325,7 @@ func (x *LookupProductByIdRequestKey) String() string { func (*LookupProductByIdRequestKey) ProtoMessage() {} func (x *LookupProductByIdRequestKey) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[2] + mi := &file_product_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -203,7 +338,7 @@ func (x *LookupProductByIdRequestKey) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdRequestKey.ProtoReflect.Descriptor instead. func (*LookupProductByIdRequestKey) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{2} + return file_product_proto_rawDescGZIP(), []int{5} } func (x *LookupProductByIdRequestKey) GetId() string { @@ -225,7 +360,7 @@ type LookupProductByIdRequest struct { func (x *LookupProductByIdRequest) Reset() { *x = LookupProductByIdRequest{} - mi := &file_product_proto_msgTypes[3] + mi := &file_product_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -237,7 +372,7 @@ func (x *LookupProductByIdRequest) String() string { func (*LookupProductByIdRequest) ProtoMessage() {} func (x *LookupProductByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[3] + mi := &file_product_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -250,7 +385,7 @@ func (x *LookupProductByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdRequest.ProtoReflect.Descriptor instead. func (*LookupProductByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{3} + return file_product_proto_rawDescGZIP(), []int{6} } func (x *LookupProductByIdRequest) GetKeys() []*LookupProductByIdRequestKey { @@ -283,7 +418,7 @@ type LookupProductByIdResponse struct { func (x *LookupProductByIdResponse) Reset() { *x = LookupProductByIdResponse{} - mi := &file_product_proto_msgTypes[4] + mi := &file_product_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -295,7 +430,7 @@ func (x *LookupProductByIdResponse) String() string { func (*LookupProductByIdResponse) ProtoMessage() {} func (x *LookupProductByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[4] + mi := &file_product_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -308,7 +443,7 @@ func (x *LookupProductByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdResponse.ProtoReflect.Descriptor instead. func (*LookupProductByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{4} + return file_product_proto_rawDescGZIP(), []int{7} } func (x *LookupProductByIdResponse) GetResult() []*Product { @@ -329,7 +464,7 @@ type LookupStorageByIdRequestKey struct { func (x *LookupStorageByIdRequestKey) Reset() { *x = LookupStorageByIdRequestKey{} - mi := &file_product_proto_msgTypes[5] + mi := &file_product_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -341,7 +476,7 @@ func (x *LookupStorageByIdRequestKey) String() string { func (*LookupStorageByIdRequestKey) ProtoMessage() {} func (x *LookupStorageByIdRequestKey) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[5] + mi := &file_product_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -354,7 +489,7 @@ func (x *LookupStorageByIdRequestKey) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdRequestKey.ProtoReflect.Descriptor instead. func (*LookupStorageByIdRequestKey) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{5} + return file_product_proto_rawDescGZIP(), []int{8} } func (x *LookupStorageByIdRequestKey) GetId() string { @@ -376,7 +511,7 @@ type LookupStorageByIdRequest struct { func (x *LookupStorageByIdRequest) Reset() { *x = LookupStorageByIdRequest{} - mi := &file_product_proto_msgTypes[6] + mi := &file_product_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -388,7 +523,7 @@ func (x *LookupStorageByIdRequest) String() string { func (*LookupStorageByIdRequest) ProtoMessage() {} func (x *LookupStorageByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[6] + mi := &file_product_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -401,7 +536,7 @@ func (x *LookupStorageByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdRequest.ProtoReflect.Descriptor instead. func (*LookupStorageByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{6} + return file_product_proto_rawDescGZIP(), []int{9} } func (x *LookupStorageByIdRequest) GetKeys() []*LookupStorageByIdRequestKey { @@ -434,7 +569,7 @@ type LookupStorageByIdResponse struct { func (x *LookupStorageByIdResponse) Reset() { *x = LookupStorageByIdResponse{} - mi := &file_product_proto_msgTypes[7] + mi := &file_product_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -446,7 +581,7 @@ func (x *LookupStorageByIdResponse) String() string { func (*LookupStorageByIdResponse) ProtoMessage() {} func (x *LookupStorageByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[7] + mi := &file_product_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -459,7 +594,7 @@ func (x *LookupStorageByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdResponse.ProtoReflect.Descriptor instead. func (*LookupStorageByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{7} + return file_product_proto_rawDescGZIP(), []int{10} } func (x *LookupStorageByIdResponse) GetResult() []*Storage { @@ -478,7 +613,7 @@ type QueryUsersRequest struct { func (x *QueryUsersRequest) Reset() { *x = QueryUsersRequest{} - mi := &file_product_proto_msgTypes[8] + mi := &file_product_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -490,7 +625,7 @@ func (x *QueryUsersRequest) String() string { func (*QueryUsersRequest) ProtoMessage() {} func (x *QueryUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[8] + mi := &file_product_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -503,7 +638,7 @@ func (x *QueryUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUsersRequest.ProtoReflect.Descriptor instead. func (*QueryUsersRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{8} + return file_product_proto_rawDescGZIP(), []int{11} } // Response message for users operation. @@ -516,7 +651,7 @@ type QueryUsersResponse struct { func (x *QueryUsersResponse) Reset() { *x = QueryUsersResponse{} - mi := &file_product_proto_msgTypes[9] + mi := &file_product_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -528,7 +663,7 @@ func (x *QueryUsersResponse) String() string { func (*QueryUsersResponse) ProtoMessage() {} func (x *QueryUsersResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[9] + mi := &file_product_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -541,7 +676,7 @@ func (x *QueryUsersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUsersResponse.ProtoReflect.Descriptor instead. func (*QueryUsersResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{9} + return file_product_proto_rawDescGZIP(), []int{12} } func (x *QueryUsersResponse) GetUsers() []*User { @@ -561,7 +696,7 @@ type QueryUserRequest struct { func (x *QueryUserRequest) Reset() { *x = QueryUserRequest{} - mi := &file_product_proto_msgTypes[10] + mi := &file_product_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +708,7 @@ func (x *QueryUserRequest) String() string { func (*QueryUserRequest) ProtoMessage() {} func (x *QueryUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[10] + mi := &file_product_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +721,7 @@ func (x *QueryUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUserRequest.ProtoReflect.Descriptor instead. func (*QueryUserRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{10} + return file_product_proto_rawDescGZIP(), []int{13} } func (x *QueryUserRequest) GetId() string { @@ -606,7 +741,7 @@ type QueryUserResponse struct { func (x *QueryUserResponse) Reset() { *x = QueryUserResponse{} - mi := &file_product_proto_msgTypes[11] + mi := &file_product_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -618,7 +753,7 @@ func (x *QueryUserResponse) String() string { func (*QueryUserResponse) ProtoMessage() {} func (x *QueryUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[11] + mi := &file_product_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -631,7 +766,7 @@ func (x *QueryUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUserResponse.ProtoReflect.Descriptor instead. func (*QueryUserResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{11} + return file_product_proto_rawDescGZIP(), []int{14} } func (x *QueryUserResponse) GetUser() *User { @@ -650,7 +785,7 @@ type QueryNestedTypeRequest struct { func (x *QueryNestedTypeRequest) Reset() { *x = QueryNestedTypeRequest{} - mi := &file_product_proto_msgTypes[12] + mi := &file_product_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -662,7 +797,7 @@ func (x *QueryNestedTypeRequest) String() string { func (*QueryNestedTypeRequest) ProtoMessage() {} func (x *QueryNestedTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[12] + mi := &file_product_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -675,7 +810,7 @@ func (x *QueryNestedTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNestedTypeRequest.ProtoReflect.Descriptor instead. func (*QueryNestedTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{12} + return file_product_proto_rawDescGZIP(), []int{15} } // Response message for nestedType operation. @@ -688,7 +823,7 @@ type QueryNestedTypeResponse struct { func (x *QueryNestedTypeResponse) Reset() { *x = QueryNestedTypeResponse{} - mi := &file_product_proto_msgTypes[13] + mi := &file_product_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -700,7 +835,7 @@ func (x *QueryNestedTypeResponse) String() string { func (*QueryNestedTypeResponse) ProtoMessage() {} func (x *QueryNestedTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[13] + mi := &file_product_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -713,7 +848,7 @@ func (x *QueryNestedTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNestedTypeResponse.ProtoReflect.Descriptor instead. func (*QueryNestedTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{13} + return file_product_proto_rawDescGZIP(), []int{16} } func (x *QueryNestedTypeResponse) GetNestedType() []*NestedTypeA { @@ -732,7 +867,7 @@ type QueryRecursiveTypeRequest struct { func (x *QueryRecursiveTypeRequest) Reset() { *x = QueryRecursiveTypeRequest{} - mi := &file_product_proto_msgTypes[14] + mi := &file_product_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -744,7 +879,7 @@ func (x *QueryRecursiveTypeRequest) String() string { func (*QueryRecursiveTypeRequest) ProtoMessage() {} func (x *QueryRecursiveTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[14] + mi := &file_product_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -757,7 +892,7 @@ func (x *QueryRecursiveTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRecursiveTypeRequest.ProtoReflect.Descriptor instead. func (*QueryRecursiveTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{14} + return file_product_proto_rawDescGZIP(), []int{17} } // Response message for recursiveType operation. @@ -770,7 +905,7 @@ type QueryRecursiveTypeResponse struct { func (x *QueryRecursiveTypeResponse) Reset() { *x = QueryRecursiveTypeResponse{} - mi := &file_product_proto_msgTypes[15] + mi := &file_product_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -782,7 +917,7 @@ func (x *QueryRecursiveTypeResponse) String() string { func (*QueryRecursiveTypeResponse) ProtoMessage() {} func (x *QueryRecursiveTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[15] + mi := &file_product_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -795,7 +930,7 @@ func (x *QueryRecursiveTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRecursiveTypeResponse.ProtoReflect.Descriptor instead. func (*QueryRecursiveTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{15} + return file_product_proto_rawDescGZIP(), []int{18} } func (x *QueryRecursiveTypeResponse) GetRecursiveType() *RecursiveType { @@ -816,7 +951,7 @@ type QueryTypeFilterWithArgumentsRequest struct { func (x *QueryTypeFilterWithArgumentsRequest) Reset() { *x = QueryTypeFilterWithArgumentsRequest{} - mi := &file_product_proto_msgTypes[16] + mi := &file_product_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -828,7 +963,7 @@ func (x *QueryTypeFilterWithArgumentsRequest) String() string { func (*QueryTypeFilterWithArgumentsRequest) ProtoMessage() {} func (x *QueryTypeFilterWithArgumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[16] + mi := &file_product_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -841,7 +976,7 @@ func (x *QueryTypeFilterWithArgumentsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryTypeFilterWithArgumentsRequest.ProtoReflect.Descriptor instead. func (*QueryTypeFilterWithArgumentsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{16} + return file_product_proto_rawDescGZIP(), []int{19} } func (x *QueryTypeFilterWithArgumentsRequest) GetFilterField_1() string { @@ -868,7 +1003,7 @@ type QueryTypeFilterWithArgumentsResponse struct { func (x *QueryTypeFilterWithArgumentsResponse) Reset() { *x = QueryTypeFilterWithArgumentsResponse{} - mi := &file_product_proto_msgTypes[17] + mi := &file_product_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -880,7 +1015,7 @@ func (x *QueryTypeFilterWithArgumentsResponse) String() string { func (*QueryTypeFilterWithArgumentsResponse) ProtoMessage() {} func (x *QueryTypeFilterWithArgumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[17] + mi := &file_product_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -893,7 +1028,7 @@ func (x *QueryTypeFilterWithArgumentsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use QueryTypeFilterWithArgumentsResponse.ProtoReflect.Descriptor instead. func (*QueryTypeFilterWithArgumentsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{17} + return file_product_proto_rawDescGZIP(), []int{20} } func (x *QueryTypeFilterWithArgumentsResponse) GetTypeFilterWithArguments() []*TypeWithMultipleFilterFields { @@ -913,7 +1048,7 @@ type QueryTypeWithMultipleFilterFieldsRequest struct { func (x *QueryTypeWithMultipleFilterFieldsRequest) Reset() { *x = QueryTypeWithMultipleFilterFieldsRequest{} - mi := &file_product_proto_msgTypes[18] + mi := &file_product_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -925,7 +1060,7 @@ func (x *QueryTypeWithMultipleFilterFieldsRequest) String() string { func (*QueryTypeWithMultipleFilterFieldsRequest) ProtoMessage() {} func (x *QueryTypeWithMultipleFilterFieldsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[18] + mi := &file_product_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -938,7 +1073,7 @@ func (x *QueryTypeWithMultipleFilterFieldsRequest) ProtoReflect() protoreflect.M // Deprecated: Use QueryTypeWithMultipleFilterFieldsRequest.ProtoReflect.Descriptor instead. func (*QueryTypeWithMultipleFilterFieldsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{18} + return file_product_proto_rawDescGZIP(), []int{21} } func (x *QueryTypeWithMultipleFilterFieldsRequest) GetFilter() *FilterTypeInput { @@ -958,7 +1093,7 @@ type QueryTypeWithMultipleFilterFieldsResponse struct { func (x *QueryTypeWithMultipleFilterFieldsResponse) Reset() { *x = QueryTypeWithMultipleFilterFieldsResponse{} - mi := &file_product_proto_msgTypes[19] + mi := &file_product_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -970,7 +1105,7 @@ func (x *QueryTypeWithMultipleFilterFieldsResponse) String() string { func (*QueryTypeWithMultipleFilterFieldsResponse) ProtoMessage() {} func (x *QueryTypeWithMultipleFilterFieldsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[19] + mi := &file_product_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -983,7 +1118,7 @@ func (x *QueryTypeWithMultipleFilterFieldsResponse) ProtoReflect() protoreflect. // Deprecated: Use QueryTypeWithMultipleFilterFieldsResponse.ProtoReflect.Descriptor instead. func (*QueryTypeWithMultipleFilterFieldsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{19} + return file_product_proto_rawDescGZIP(), []int{22} } func (x *QueryTypeWithMultipleFilterFieldsResponse) GetTypeWithMultipleFilterFields() []*TypeWithMultipleFilterFields { @@ -1003,7 +1138,7 @@ type QueryComplexFilterTypeRequest struct { func (x *QueryComplexFilterTypeRequest) Reset() { *x = QueryComplexFilterTypeRequest{} - mi := &file_product_proto_msgTypes[20] + mi := &file_product_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1015,7 +1150,7 @@ func (x *QueryComplexFilterTypeRequest) String() string { func (*QueryComplexFilterTypeRequest) ProtoMessage() {} func (x *QueryComplexFilterTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[20] + mi := &file_product_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1028,7 +1163,7 @@ func (x *QueryComplexFilterTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryComplexFilterTypeRequest.ProtoReflect.Descriptor instead. func (*QueryComplexFilterTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{20} + return file_product_proto_rawDescGZIP(), []int{23} } func (x *QueryComplexFilterTypeRequest) GetFilter() *ComplexFilterTypeInput { @@ -1048,7 +1183,7 @@ type QueryComplexFilterTypeResponse struct { func (x *QueryComplexFilterTypeResponse) Reset() { *x = QueryComplexFilterTypeResponse{} - mi := &file_product_proto_msgTypes[21] + mi := &file_product_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1060,7 +1195,7 @@ func (x *QueryComplexFilterTypeResponse) String() string { func (*QueryComplexFilterTypeResponse) ProtoMessage() {} func (x *QueryComplexFilterTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[21] + mi := &file_product_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1073,7 +1208,7 @@ func (x *QueryComplexFilterTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryComplexFilterTypeResponse.ProtoReflect.Descriptor instead. func (*QueryComplexFilterTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{21} + return file_product_proto_rawDescGZIP(), []int{24} } func (x *QueryComplexFilterTypeResponse) GetComplexFilterType() []*TypeWithComplexFilterInput { @@ -1093,7 +1228,7 @@ type QueryCalculateTotalsRequest struct { func (x *QueryCalculateTotalsRequest) Reset() { *x = QueryCalculateTotalsRequest{} - mi := &file_product_proto_msgTypes[22] + mi := &file_product_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1105,7 +1240,7 @@ func (x *QueryCalculateTotalsRequest) String() string { func (*QueryCalculateTotalsRequest) ProtoMessage() {} func (x *QueryCalculateTotalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[22] + mi := &file_product_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1118,7 +1253,7 @@ func (x *QueryCalculateTotalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCalculateTotalsRequest.ProtoReflect.Descriptor instead. func (*QueryCalculateTotalsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{22} + return file_product_proto_rawDescGZIP(), []int{25} } func (x *QueryCalculateTotalsRequest) GetOrders() []*OrderInput { @@ -1138,7 +1273,7 @@ type QueryCalculateTotalsResponse struct { func (x *QueryCalculateTotalsResponse) Reset() { *x = QueryCalculateTotalsResponse{} - mi := &file_product_proto_msgTypes[23] + mi := &file_product_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1150,7 +1285,7 @@ func (x *QueryCalculateTotalsResponse) String() string { func (*QueryCalculateTotalsResponse) ProtoMessage() {} func (x *QueryCalculateTotalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[23] + mi := &file_product_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1163,7 +1298,7 @@ func (x *QueryCalculateTotalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCalculateTotalsResponse.ProtoReflect.Descriptor instead. func (*QueryCalculateTotalsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{23} + return file_product_proto_rawDescGZIP(), []int{26} } func (x *QueryCalculateTotalsResponse) GetCalculateTotals() []*Order { @@ -1182,7 +1317,7 @@ type QueryCategoriesRequest struct { func (x *QueryCategoriesRequest) Reset() { *x = QueryCategoriesRequest{} - mi := &file_product_proto_msgTypes[24] + mi := &file_product_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1194,7 +1329,7 @@ func (x *QueryCategoriesRequest) String() string { func (*QueryCategoriesRequest) ProtoMessage() {} func (x *QueryCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[24] + mi := &file_product_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1207,7 +1342,7 @@ func (x *QueryCategoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{24} + return file_product_proto_rawDescGZIP(), []int{27} } // Response message for categories operation. @@ -1220,7 +1355,7 @@ type QueryCategoriesResponse struct { func (x *QueryCategoriesResponse) Reset() { *x = QueryCategoriesResponse{} - mi := &file_product_proto_msgTypes[25] + mi := &file_product_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1232,7 +1367,7 @@ func (x *QueryCategoriesResponse) String() string { func (*QueryCategoriesResponse) ProtoMessage() {} func (x *QueryCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[25] + mi := &file_product_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1245,7 +1380,7 @@ func (x *QueryCategoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{25} + return file_product_proto_rawDescGZIP(), []int{28} } func (x *QueryCategoriesResponse) GetCategories() []*Category { @@ -1265,7 +1400,7 @@ type QueryCategoriesByKindRequest struct { func (x *QueryCategoriesByKindRequest) Reset() { *x = QueryCategoriesByKindRequest{} - mi := &file_product_proto_msgTypes[26] + mi := &file_product_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1277,7 +1412,7 @@ func (x *QueryCategoriesByKindRequest) String() string { func (*QueryCategoriesByKindRequest) ProtoMessage() {} func (x *QueryCategoriesByKindRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[26] + mi := &file_product_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1290,7 +1425,7 @@ func (x *QueryCategoriesByKindRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{26} + return file_product_proto_rawDescGZIP(), []int{29} } func (x *QueryCategoriesByKindRequest) GetKind() CategoryKind { @@ -1310,7 +1445,7 @@ type QueryCategoriesByKindResponse struct { func (x *QueryCategoriesByKindResponse) Reset() { *x = QueryCategoriesByKindResponse{} - mi := &file_product_proto_msgTypes[27] + mi := &file_product_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1322,7 +1457,7 @@ func (x *QueryCategoriesByKindResponse) String() string { func (*QueryCategoriesByKindResponse) ProtoMessage() {} func (x *QueryCategoriesByKindResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[27] + mi := &file_product_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1335,7 +1470,7 @@ func (x *QueryCategoriesByKindResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{27} + return file_product_proto_rawDescGZIP(), []int{30} } func (x *QueryCategoriesByKindResponse) GetCategoriesByKind() []*Category { @@ -1355,7 +1490,7 @@ type QueryCategoriesByKindsRequest struct { func (x *QueryCategoriesByKindsRequest) Reset() { *x = QueryCategoriesByKindsRequest{} - mi := &file_product_proto_msgTypes[28] + mi := &file_product_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1367,7 +1502,7 @@ func (x *QueryCategoriesByKindsRequest) String() string { func (*QueryCategoriesByKindsRequest) ProtoMessage() {} func (x *QueryCategoriesByKindsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[28] + mi := &file_product_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1380,7 +1515,7 @@ func (x *QueryCategoriesByKindsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindsRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{28} + return file_product_proto_rawDescGZIP(), []int{31} } func (x *QueryCategoriesByKindsRequest) GetKinds() []CategoryKind { @@ -1400,7 +1535,7 @@ type QueryCategoriesByKindsResponse struct { func (x *QueryCategoriesByKindsResponse) Reset() { *x = QueryCategoriesByKindsResponse{} - mi := &file_product_proto_msgTypes[29] + mi := &file_product_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1412,7 +1547,7 @@ func (x *QueryCategoriesByKindsResponse) String() string { func (*QueryCategoriesByKindsResponse) ProtoMessage() {} func (x *QueryCategoriesByKindsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[29] + mi := &file_product_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1425,7 +1560,7 @@ func (x *QueryCategoriesByKindsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindsResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{29} + return file_product_proto_rawDescGZIP(), []int{32} } func (x *QueryCategoriesByKindsResponse) GetCategoriesByKinds() []*Category { @@ -1445,7 +1580,7 @@ type QueryFilterCategoriesRequest struct { func (x *QueryFilterCategoriesRequest) Reset() { *x = QueryFilterCategoriesRequest{} - mi := &file_product_proto_msgTypes[30] + mi := &file_product_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1457,7 +1592,7 @@ func (x *QueryFilterCategoriesRequest) String() string { func (*QueryFilterCategoriesRequest) ProtoMessage() {} func (x *QueryFilterCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[30] + mi := &file_product_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1470,7 +1605,7 @@ func (x *QueryFilterCategoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFilterCategoriesRequest.ProtoReflect.Descriptor instead. func (*QueryFilterCategoriesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{30} + return file_product_proto_rawDescGZIP(), []int{33} } func (x *QueryFilterCategoriesRequest) GetFilter() *CategoryFilter { @@ -1490,7 +1625,7 @@ type QueryFilterCategoriesResponse struct { func (x *QueryFilterCategoriesResponse) Reset() { *x = QueryFilterCategoriesResponse{} - mi := &file_product_proto_msgTypes[31] + mi := &file_product_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1502,7 +1637,7 @@ func (x *QueryFilterCategoriesResponse) String() string { func (*QueryFilterCategoriesResponse) ProtoMessage() {} func (x *QueryFilterCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[31] + mi := &file_product_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1515,7 +1650,7 @@ func (x *QueryFilterCategoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFilterCategoriesResponse.ProtoReflect.Descriptor instead. func (*QueryFilterCategoriesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{31} + return file_product_proto_rawDescGZIP(), []int{34} } func (x *QueryFilterCategoriesResponse) GetFilterCategories() []*Category { @@ -1534,7 +1669,7 @@ type QueryRandomPetRequest struct { func (x *QueryRandomPetRequest) Reset() { *x = QueryRandomPetRequest{} - mi := &file_product_proto_msgTypes[32] + mi := &file_product_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1546,7 +1681,7 @@ func (x *QueryRandomPetRequest) String() string { func (*QueryRandomPetRequest) ProtoMessage() {} func (x *QueryRandomPetRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[32] + mi := &file_product_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1559,7 +1694,7 @@ func (x *QueryRandomPetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomPetRequest.ProtoReflect.Descriptor instead. func (*QueryRandomPetRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{32} + return file_product_proto_rawDescGZIP(), []int{35} } // Response message for randomPet operation. @@ -1572,7 +1707,7 @@ type QueryRandomPetResponse struct { func (x *QueryRandomPetResponse) Reset() { *x = QueryRandomPetResponse{} - mi := &file_product_proto_msgTypes[33] + mi := &file_product_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1584,7 +1719,7 @@ func (x *QueryRandomPetResponse) String() string { func (*QueryRandomPetResponse) ProtoMessage() {} func (x *QueryRandomPetResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[33] + mi := &file_product_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1597,7 +1732,7 @@ func (x *QueryRandomPetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomPetResponse.ProtoReflect.Descriptor instead. func (*QueryRandomPetResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{33} + return file_product_proto_rawDescGZIP(), []int{36} } func (x *QueryRandomPetResponse) GetRandomPet() *Animal { @@ -1616,7 +1751,7 @@ type QueryAllPetsRequest struct { func (x *QueryAllPetsRequest) Reset() { *x = QueryAllPetsRequest{} - mi := &file_product_proto_msgTypes[34] + mi := &file_product_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1628,7 +1763,7 @@ func (x *QueryAllPetsRequest) String() string { func (*QueryAllPetsRequest) ProtoMessage() {} func (x *QueryAllPetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[34] + mi := &file_product_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1641,7 +1776,7 @@ func (x *QueryAllPetsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllPetsRequest.ProtoReflect.Descriptor instead. func (*QueryAllPetsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{34} + return file_product_proto_rawDescGZIP(), []int{37} } // Response message for allPets operation. @@ -1654,7 +1789,7 @@ type QueryAllPetsResponse struct { func (x *QueryAllPetsResponse) Reset() { *x = QueryAllPetsResponse{} - mi := &file_product_proto_msgTypes[35] + mi := &file_product_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1666,7 +1801,7 @@ func (x *QueryAllPetsResponse) String() string { func (*QueryAllPetsResponse) ProtoMessage() {} func (x *QueryAllPetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[35] + mi := &file_product_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1679,7 +1814,7 @@ func (x *QueryAllPetsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllPetsResponse.ProtoReflect.Descriptor instead. func (*QueryAllPetsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{35} + return file_product_proto_rawDescGZIP(), []int{38} } func (x *QueryAllPetsResponse) GetAllPets() []*Animal { @@ -1699,7 +1834,7 @@ type QuerySearchRequest struct { func (x *QuerySearchRequest) Reset() { *x = QuerySearchRequest{} - mi := &file_product_proto_msgTypes[36] + mi := &file_product_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1711,7 +1846,7 @@ func (x *QuerySearchRequest) String() string { func (*QuerySearchRequest) ProtoMessage() {} func (x *QuerySearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[36] + mi := &file_product_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1724,7 +1859,7 @@ func (x *QuerySearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QuerySearchRequest.ProtoReflect.Descriptor instead. func (*QuerySearchRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{36} + return file_product_proto_rawDescGZIP(), []int{39} } func (x *QuerySearchRequest) GetInput() *SearchInput { @@ -1744,7 +1879,7 @@ type QuerySearchResponse struct { func (x *QuerySearchResponse) Reset() { *x = QuerySearchResponse{} - mi := &file_product_proto_msgTypes[37] + mi := &file_product_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1756,7 +1891,7 @@ func (x *QuerySearchResponse) String() string { func (*QuerySearchResponse) ProtoMessage() {} func (x *QuerySearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[37] + mi := &file_product_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1769,7 +1904,7 @@ func (x *QuerySearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QuerySearchResponse.ProtoReflect.Descriptor instead. func (*QuerySearchResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{37} + return file_product_proto_rawDescGZIP(), []int{40} } func (x *QuerySearchResponse) GetSearch() []*SearchResult { @@ -1788,7 +1923,7 @@ type QueryRandomSearchResultRequest struct { func (x *QueryRandomSearchResultRequest) Reset() { *x = QueryRandomSearchResultRequest{} - mi := &file_product_proto_msgTypes[38] + mi := &file_product_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1800,7 +1935,7 @@ func (x *QueryRandomSearchResultRequest) String() string { func (*QueryRandomSearchResultRequest) ProtoMessage() {} func (x *QueryRandomSearchResultRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[38] + mi := &file_product_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1813,7 +1948,7 @@ func (x *QueryRandomSearchResultRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomSearchResultRequest.ProtoReflect.Descriptor instead. func (*QueryRandomSearchResultRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{38} + return file_product_proto_rawDescGZIP(), []int{41} } // Response message for randomSearchResult operation. @@ -1826,7 +1961,7 @@ type QueryRandomSearchResultResponse struct { func (x *QueryRandomSearchResultResponse) Reset() { *x = QueryRandomSearchResultResponse{} - mi := &file_product_proto_msgTypes[39] + mi := &file_product_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1838,7 +1973,7 @@ func (x *QueryRandomSearchResultResponse) String() string { func (*QueryRandomSearchResultResponse) ProtoMessage() {} func (x *QueryRandomSearchResultResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[39] + mi := &file_product_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1851,7 +1986,7 @@ func (x *QueryRandomSearchResultResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomSearchResultResponse.ProtoReflect.Descriptor instead. func (*QueryRandomSearchResultResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{39} + return file_product_proto_rawDescGZIP(), []int{42} } func (x *QueryRandomSearchResultResponse) GetRandomSearchResult() *SearchResult { @@ -1870,7 +2005,7 @@ type QueryNullableFieldsTypeRequest struct { func (x *QueryNullableFieldsTypeRequest) Reset() { *x = QueryNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[40] + mi := &file_product_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1882,7 +2017,7 @@ func (x *QueryNullableFieldsTypeRequest) String() string { func (*QueryNullableFieldsTypeRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[40] + mi := &file_product_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1895,7 +2030,7 @@ func (x *QueryNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{40} + return file_product_proto_rawDescGZIP(), []int{43} } // Response message for nullableFieldsType operation. @@ -1908,7 +2043,7 @@ type QueryNullableFieldsTypeResponse struct { func (x *QueryNullableFieldsTypeResponse) Reset() { *x = QueryNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[41] + mi := &file_product_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1920,7 +2055,7 @@ func (x *QueryNullableFieldsTypeResponse) String() string { func (*QueryNullableFieldsTypeResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[41] + mi := &file_product_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1933,7 +2068,7 @@ func (x *QueryNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{41} + return file_product_proto_rawDescGZIP(), []int{44} } func (x *QueryNullableFieldsTypeResponse) GetNullableFieldsType() *NullableFieldsType { @@ -1953,7 +2088,7 @@ type QueryNullableFieldsTypeByIdRequest struct { func (x *QueryNullableFieldsTypeByIdRequest) Reset() { *x = QueryNullableFieldsTypeByIdRequest{} - mi := &file_product_proto_msgTypes[42] + mi := &file_product_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1965,7 +2100,7 @@ func (x *QueryNullableFieldsTypeByIdRequest) String() string { func (*QueryNullableFieldsTypeByIdRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[42] + mi := &file_product_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1978,7 +2113,7 @@ func (x *QueryNullableFieldsTypeByIdRequest) ProtoReflect() protoreflect.Message // Deprecated: Use QueryNullableFieldsTypeByIdRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{42} + return file_product_proto_rawDescGZIP(), []int{45} } func (x *QueryNullableFieldsTypeByIdRequest) GetId() string { @@ -1998,7 +2133,7 @@ type QueryNullableFieldsTypeByIdResponse struct { func (x *QueryNullableFieldsTypeByIdResponse) Reset() { *x = QueryNullableFieldsTypeByIdResponse{} - mi := &file_product_proto_msgTypes[43] + mi := &file_product_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2010,7 +2145,7 @@ func (x *QueryNullableFieldsTypeByIdResponse) String() string { func (*QueryNullableFieldsTypeByIdResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[43] + mi := &file_product_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2023,7 +2158,7 @@ func (x *QueryNullableFieldsTypeByIdResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryNullableFieldsTypeByIdResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{43} + return file_product_proto_rawDescGZIP(), []int{46} } func (x *QueryNullableFieldsTypeByIdResponse) GetNullableFieldsTypeById() *NullableFieldsType { @@ -2043,7 +2178,7 @@ type QueryNullableFieldsTypeWithFilterRequest struct { func (x *QueryNullableFieldsTypeWithFilterRequest) Reset() { *x = QueryNullableFieldsTypeWithFilterRequest{} - mi := &file_product_proto_msgTypes[44] + mi := &file_product_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2055,7 +2190,7 @@ func (x *QueryNullableFieldsTypeWithFilterRequest) String() string { func (*QueryNullableFieldsTypeWithFilterRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeWithFilterRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[44] + mi := &file_product_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2068,7 +2203,7 @@ func (x *QueryNullableFieldsTypeWithFilterRequest) ProtoReflect() protoreflect.M // Deprecated: Use QueryNullableFieldsTypeWithFilterRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeWithFilterRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{44} + return file_product_proto_rawDescGZIP(), []int{47} } func (x *QueryNullableFieldsTypeWithFilterRequest) GetFilter() *NullableFieldsFilter { @@ -2088,7 +2223,7 @@ type QueryNullableFieldsTypeWithFilterResponse struct { func (x *QueryNullableFieldsTypeWithFilterResponse) Reset() { *x = QueryNullableFieldsTypeWithFilterResponse{} - mi := &file_product_proto_msgTypes[45] + mi := &file_product_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2100,7 +2235,7 @@ func (x *QueryNullableFieldsTypeWithFilterResponse) String() string { func (*QueryNullableFieldsTypeWithFilterResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeWithFilterResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[45] + mi := &file_product_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2113,7 +2248,7 @@ func (x *QueryNullableFieldsTypeWithFilterResponse) ProtoReflect() protoreflect. // Deprecated: Use QueryNullableFieldsTypeWithFilterResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeWithFilterResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{45} + return file_product_proto_rawDescGZIP(), []int{48} } func (x *QueryNullableFieldsTypeWithFilterResponse) GetNullableFieldsTypeWithFilter() []*NullableFieldsType { @@ -2132,7 +2267,7 @@ type QueryAllNullableFieldsTypesRequest struct { func (x *QueryAllNullableFieldsTypesRequest) Reset() { *x = QueryAllNullableFieldsTypesRequest{} - mi := &file_product_proto_msgTypes[46] + mi := &file_product_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2144,7 +2279,7 @@ func (x *QueryAllNullableFieldsTypesRequest) String() string { func (*QueryAllNullableFieldsTypesRequest) ProtoMessage() {} func (x *QueryAllNullableFieldsTypesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[46] + mi := &file_product_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2157,7 +2292,7 @@ func (x *QueryAllNullableFieldsTypesRequest) ProtoReflect() protoreflect.Message // Deprecated: Use QueryAllNullableFieldsTypesRequest.ProtoReflect.Descriptor instead. func (*QueryAllNullableFieldsTypesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{46} + return file_product_proto_rawDescGZIP(), []int{49} } // Response message for allNullableFieldsTypes operation. @@ -2170,7 +2305,7 @@ type QueryAllNullableFieldsTypesResponse struct { func (x *QueryAllNullableFieldsTypesResponse) Reset() { *x = QueryAllNullableFieldsTypesResponse{} - mi := &file_product_proto_msgTypes[47] + mi := &file_product_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2182,7 +2317,7 @@ func (x *QueryAllNullableFieldsTypesResponse) String() string { func (*QueryAllNullableFieldsTypesResponse) ProtoMessage() {} func (x *QueryAllNullableFieldsTypesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[47] + mi := &file_product_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2195,7 +2330,7 @@ func (x *QueryAllNullableFieldsTypesResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryAllNullableFieldsTypesResponse.ProtoReflect.Descriptor instead. func (*QueryAllNullableFieldsTypesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{47} + return file_product_proto_rawDescGZIP(), []int{50} } func (x *QueryAllNullableFieldsTypesResponse) GetAllNullableFieldsTypes() []*NullableFieldsType { @@ -2205,29 +2340,28 @@ func (x *QueryAllNullableFieldsTypesResponse) GetAllNullableFieldsTypes() []*Nul return nil } -// Request message for createUser operation. -type MutationCreateUserRequest struct { +// Request message for blogPost operation. +type QueryBlogPostRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Input *UserInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *MutationCreateUserRequest) Reset() { - *x = MutationCreateUserRequest{} - mi := &file_product_proto_msgTypes[48] +func (x *QueryBlogPostRequest) Reset() { + *x = QueryBlogPostRequest{} + mi := &file_product_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationCreateUserRequest) String() string { +func (x *QueryBlogPostRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationCreateUserRequest) ProtoMessage() {} +func (*QueryBlogPostRequest) ProtoMessage() {} -func (x *MutationCreateUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[48] +func (x *QueryBlogPostRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2238,41 +2372,34 @@ func (x *MutationCreateUserRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MutationCreateUserRequest.ProtoReflect.Descriptor instead. -func (*MutationCreateUserRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{48} -} - -func (x *MutationCreateUserRequest) GetInput() *UserInput { - if x != nil { - return x.Input - } - return nil +// Deprecated: Use QueryBlogPostRequest.ProtoReflect.Descriptor instead. +func (*QueryBlogPostRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{51} } -// Response message for createUser operation. -type MutationCreateUserResponse struct { +// Response message for blogPost operation. +type QueryBlogPostResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - CreateUser *User `protobuf:"bytes,1,opt,name=create_user,json=createUser,proto3" json:"create_user,omitempty"` + BlogPost *BlogPost `protobuf:"bytes,1,opt,name=blog_post,json=blogPost,proto3" json:"blog_post,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *MutationCreateUserResponse) Reset() { - *x = MutationCreateUserResponse{} - mi := &file_product_proto_msgTypes[49] +func (x *QueryBlogPostResponse) Reset() { + *x = QueryBlogPostResponse{} + mi := &file_product_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationCreateUserResponse) String() string { +func (x *QueryBlogPostResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationCreateUserResponse) ProtoMessage() {} +func (*QueryBlogPostResponse) ProtoMessage() {} -func (x *MutationCreateUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[49] +func (x *QueryBlogPostResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2283,41 +2410,41 @@ func (x *MutationCreateUserResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MutationCreateUserResponse.ProtoReflect.Descriptor instead. -func (*MutationCreateUserResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{49} +// Deprecated: Use QueryBlogPostResponse.ProtoReflect.Descriptor instead. +func (*QueryBlogPostResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{52} } -func (x *MutationCreateUserResponse) GetCreateUser() *User { +func (x *QueryBlogPostResponse) GetBlogPost() *BlogPost { if x != nil { - return x.CreateUser + return x.BlogPost } return nil } -// Request message for performAction operation. -type MutationPerformActionRequest struct { +// Request message for blogPostById operation. +type QueryBlogPostByIdRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Input *ActionInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *MutationPerformActionRequest) Reset() { - *x = MutationPerformActionRequest{} - mi := &file_product_proto_msgTypes[50] +func (x *QueryBlogPostByIdRequest) Reset() { + *x = QueryBlogPostByIdRequest{} + mi := &file_product_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationPerformActionRequest) String() string { +func (x *QueryBlogPostByIdRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationPerformActionRequest) ProtoMessage() {} +func (*QueryBlogPostByIdRequest) ProtoMessage() {} -func (x *MutationPerformActionRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[50] +func (x *QueryBlogPostByIdRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2328,41 +2455,41 @@ func (x *MutationPerformActionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MutationPerformActionRequest.ProtoReflect.Descriptor instead. -func (*MutationPerformActionRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{50} +// Deprecated: Use QueryBlogPostByIdRequest.ProtoReflect.Descriptor instead. +func (*QueryBlogPostByIdRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{53} } -func (x *MutationPerformActionRequest) GetInput() *ActionInput { +func (x *QueryBlogPostByIdRequest) GetId() string { if x != nil { - return x.Input + return x.Id } - return nil + return "" } -// Response message for performAction operation. -type MutationPerformActionResponse struct { +// Response message for blogPostById operation. +type QueryBlogPostByIdResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - PerformAction *ActionResult `protobuf:"bytes,1,opt,name=perform_action,json=performAction,proto3" json:"perform_action,omitempty"` + BlogPostById *BlogPost `protobuf:"bytes,1,opt,name=blog_post_by_id,json=blogPostById,proto3" json:"blog_post_by_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *MutationPerformActionResponse) Reset() { - *x = MutationPerformActionResponse{} - mi := &file_product_proto_msgTypes[51] +func (x *QueryBlogPostByIdResponse) Reset() { + *x = QueryBlogPostByIdResponse{} + mi := &file_product_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationPerformActionResponse) String() string { +func (x *QueryBlogPostByIdResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationPerformActionResponse) ProtoMessage() {} +func (*QueryBlogPostByIdResponse) ProtoMessage() {} -func (x *MutationPerformActionResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[51] +func (x *QueryBlogPostByIdResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2373,41 +2500,41 @@ func (x *MutationPerformActionResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MutationPerformActionResponse.ProtoReflect.Descriptor instead. -func (*MutationPerformActionResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{51} +// Deprecated: Use QueryBlogPostByIdResponse.ProtoReflect.Descriptor instead. +func (*QueryBlogPostByIdResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{54} } -func (x *MutationPerformActionResponse) GetPerformAction() *ActionResult { +func (x *QueryBlogPostByIdResponse) GetBlogPostById() *BlogPost { if x != nil { - return x.PerformAction + return x.BlogPostById } return nil } -// Request message for createNullableFieldsType operation. -type MutationCreateNullableFieldsTypeRequest struct { +// Request message for blogPostsWithFilter operation. +type QueryBlogPostsWithFilterRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Input *NullableFieldsInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` + Filter *BlogPostFilter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *MutationCreateNullableFieldsTypeRequest) Reset() { - *x = MutationCreateNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[52] +func (x *QueryBlogPostsWithFilterRequest) Reset() { + *x = QueryBlogPostsWithFilterRequest{} + mi := &file_product_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationCreateNullableFieldsTypeRequest) String() string { +func (x *QueryBlogPostsWithFilterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationCreateNullableFieldsTypeRequest) ProtoMessage() {} +func (*QueryBlogPostsWithFilterRequest) ProtoMessage() {} -func (x *MutationCreateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[52] +func (x *QueryBlogPostsWithFilterRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2418,41 +2545,41 @@ func (x *MutationCreateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use MutationCreateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. -func (*MutationCreateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{52} +// Deprecated: Use QueryBlogPostsWithFilterRequest.ProtoReflect.Descriptor instead. +func (*QueryBlogPostsWithFilterRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{55} } -func (x *MutationCreateNullableFieldsTypeRequest) GetInput() *NullableFieldsInput { +func (x *QueryBlogPostsWithFilterRequest) GetFilter() *BlogPostFilter { if x != nil { - return x.Input + return x.Filter } return nil } -// Response message for createNullableFieldsType operation. -type MutationCreateNullableFieldsTypeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - CreateNullableFieldsType *NullableFieldsType `protobuf:"bytes,1,opt,name=create_nullable_fields_type,json=createNullableFieldsType,proto3" json:"create_nullable_fields_type,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +// Response message for blogPostsWithFilter operation. +type QueryBlogPostsWithFilterResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + BlogPostsWithFilter []*BlogPost `protobuf:"bytes,1,rep,name=blog_posts_with_filter,json=blogPostsWithFilter,proto3" json:"blog_posts_with_filter,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *MutationCreateNullableFieldsTypeResponse) Reset() { - *x = MutationCreateNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[53] +func (x *QueryBlogPostsWithFilterResponse) Reset() { + *x = QueryBlogPostsWithFilterResponse{} + mi := &file_product_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationCreateNullableFieldsTypeResponse) String() string { +func (x *QueryBlogPostsWithFilterResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationCreateNullableFieldsTypeResponse) ProtoMessage() {} +func (*QueryBlogPostsWithFilterResponse) ProtoMessage() {} -func (x *MutationCreateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[53] +func (x *QueryBlogPostsWithFilterResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2463,42 +2590,40 @@ func (x *MutationCreateNullableFieldsTypeResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use MutationCreateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. -func (*MutationCreateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{53} +// Deprecated: Use QueryBlogPostsWithFilterResponse.ProtoReflect.Descriptor instead. +func (*QueryBlogPostsWithFilterResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{56} } -func (x *MutationCreateNullableFieldsTypeResponse) GetCreateNullableFieldsType() *NullableFieldsType { +func (x *QueryBlogPostsWithFilterResponse) GetBlogPostsWithFilter() []*BlogPost { if x != nil { - return x.CreateNullableFieldsType + return x.BlogPostsWithFilter } return nil } -// Request message for updateNullableFieldsType operation. -type MutationUpdateNullableFieldsTypeRequest struct { +// Request message for allBlogPosts operation. +type QueryAllBlogPostsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Input *NullableFieldsInput `protobuf:"bytes,2,opt,name=input,proto3" json:"input,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *MutationUpdateNullableFieldsTypeRequest) Reset() { - *x = MutationUpdateNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[54] +func (x *QueryAllBlogPostsRequest) Reset() { + *x = QueryAllBlogPostsRequest{} + mi := &file_product_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationUpdateNullableFieldsTypeRequest) String() string { +func (x *QueryAllBlogPostsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationUpdateNullableFieldsTypeRequest) ProtoMessage() {} +func (*QueryAllBlogPostsRequest) ProtoMessage() {} -func (x *MutationUpdateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[54] +func (x *QueryAllBlogPostsRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2509,48 +2634,34 @@ func (x *MutationUpdateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use MutationUpdateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. -func (*MutationUpdateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{54} -} - -func (x *MutationUpdateNullableFieldsTypeRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *MutationUpdateNullableFieldsTypeRequest) GetInput() *NullableFieldsInput { - if x != nil { - return x.Input - } - return nil +// Deprecated: Use QueryAllBlogPostsRequest.ProtoReflect.Descriptor instead. +func (*QueryAllBlogPostsRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{57} } -// Response message for updateNullableFieldsType operation. -type MutationUpdateNullableFieldsTypeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - UpdateNullableFieldsType *NullableFieldsType `protobuf:"bytes,1,opt,name=update_nullable_fields_type,json=updateNullableFieldsType,proto3" json:"update_nullable_fields_type,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +// Response message for allBlogPosts operation. +type QueryAllBlogPostsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + AllBlogPosts []*BlogPost `protobuf:"bytes,1,rep,name=all_blog_posts,json=allBlogPosts,proto3" json:"all_blog_posts,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *MutationUpdateNullableFieldsTypeResponse) Reset() { - *x = MutationUpdateNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[55] +func (x *QueryAllBlogPostsResponse) Reset() { + *x = QueryAllBlogPostsResponse{} + mi := &file_product_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *MutationUpdateNullableFieldsTypeResponse) String() string { +func (x *QueryAllBlogPostsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MutationUpdateNullableFieldsTypeResponse) ProtoMessage() {} +func (*QueryAllBlogPostsResponse) ProtoMessage() {} -func (x *MutationUpdateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[55] +func (x *QueryAllBlogPostsResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2561,42 +2672,40 @@ func (x *MutationUpdateNullableFieldsTypeResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use MutationUpdateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. -func (*MutationUpdateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{55} +// Deprecated: Use QueryAllBlogPostsResponse.ProtoReflect.Descriptor instead. +func (*QueryAllBlogPostsResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{58} } -func (x *MutationUpdateNullableFieldsTypeResponse) GetUpdateNullableFieldsType() *NullableFieldsType { +func (x *QueryAllBlogPostsResponse) GetAllBlogPosts() []*BlogPost { if x != nil { - return x.UpdateNullableFieldsType + return x.AllBlogPosts } return nil } -type Product struct { +// Request message for author operation. +type QueryAuthorRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Price float64 `protobuf:"fixed64,3,opt,name=price,proto3" json:"price,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *Product) Reset() { - *x = Product{} - mi := &file_product_proto_msgTypes[56] +func (x *QueryAuthorRequest) Reset() { + *x = QueryAuthorRequest{} + mi := &file_product_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Product) String() string { +func (x *QueryAuthorRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Product) ProtoMessage() {} +func (*QueryAuthorRequest) ProtoMessage() {} -func (x *Product) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[56] +func (x *QueryAuthorRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2607,56 +2716,34 @@ func (x *Product) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Product.ProtoReflect.Descriptor instead. -func (*Product) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{56} -} - -func (x *Product) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Product) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Product) GetPrice() float64 { - if x != nil { - return x.Price - } - return 0 +// Deprecated: Use QueryAuthorRequest.ProtoReflect.Descriptor instead. +func (*QueryAuthorRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{59} } -type Storage struct { +// Response message for author operation. +type QueryAuthorResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Location string `protobuf:"bytes,3,opt,name=location,proto3" json:"location,omitempty"` + Author *Author `protobuf:"bytes,1,opt,name=author,proto3" json:"author,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *Storage) Reset() { - *x = Storage{} - mi := &file_product_proto_msgTypes[57] +func (x *QueryAuthorResponse) Reset() { + *x = QueryAuthorResponse{} + mi := &file_product_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Storage) String() string { +func (x *QueryAuthorResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Storage) ProtoMessage() {} +func (*QueryAuthorResponse) ProtoMessage() {} -func (x *Storage) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[57] +func (x *QueryAuthorResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2667,55 +2754,41 @@ func (x *Storage) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Storage.ProtoReflect.Descriptor instead. -func (*Storage) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{57} -} - -func (x *Storage) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Storage) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use QueryAuthorResponse.ProtoReflect.Descriptor instead. +func (*QueryAuthorResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{60} } -func (x *Storage) GetLocation() string { +func (x *QueryAuthorResponse) GetAuthor() *Author { if x != nil { - return x.Location + return x.Author } - return "" + return nil } -type User struct { +// Request message for authorById operation. +type QueryAuthorByIdRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *User) Reset() { - *x = User{} - mi := &file_product_proto_msgTypes[58] +func (x *QueryAuthorByIdRequest) Reset() { + *x = QueryAuthorByIdRequest{} + mi := &file_product_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *User) String() string { +func (x *QueryAuthorByIdRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*User) ProtoMessage() {} +func (*QueryAuthorByIdRequest) ProtoMessage() {} -func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[58] +func (x *QueryAuthorByIdRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2726,49 +2799,41 @@ func (x *User) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use User.ProtoReflect.Descriptor instead. -func (*User) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{58} +// Deprecated: Use QueryAuthorByIdRequest.ProtoReflect.Descriptor instead. +func (*QueryAuthorByIdRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{61} } -func (x *User) GetId() string { +func (x *QueryAuthorByIdRequest) GetId() string { if x != nil { return x.Id } return "" } -func (x *User) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type NestedTypeA struct { +// Response message for authorById operation. +type QueryAuthorByIdResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - B *NestedTypeB `protobuf:"bytes,3,opt,name=b,proto3" json:"b,omitempty"` + AuthorById *Author `protobuf:"bytes,1,opt,name=author_by_id,json=authorById,proto3" json:"author_by_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *NestedTypeA) Reset() { - *x = NestedTypeA{} - mi := &file_product_proto_msgTypes[59] +func (x *QueryAuthorByIdResponse) Reset() { + *x = QueryAuthorByIdResponse{} + mi := &file_product_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *NestedTypeA) String() string { +func (x *QueryAuthorByIdResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NestedTypeA) ProtoMessage() {} +func (*QueryAuthorByIdResponse) ProtoMessage() {} -func (x *NestedTypeA) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[59] +func (x *QueryAuthorByIdResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2779,56 +2844,41 @@ func (x *NestedTypeA) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NestedTypeA.ProtoReflect.Descriptor instead. -func (*NestedTypeA) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{59} -} - -func (x *NestedTypeA) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *NestedTypeA) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use QueryAuthorByIdResponse.ProtoReflect.Descriptor instead. +func (*QueryAuthorByIdResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{62} } -func (x *NestedTypeA) GetB() *NestedTypeB { +func (x *QueryAuthorByIdResponse) GetAuthorById() *Author { if x != nil { - return x.B + return x.AuthorById } return nil } -type RecursiveType struct { +// Request message for authorsWithFilter operation. +type QueryAuthorsWithFilterRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - RecursiveType *RecursiveType `protobuf:"bytes,3,opt,name=recursive_type,json=recursiveType,proto3" json:"recursive_type,omitempty"` + Filter *AuthorFilter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *RecursiveType) Reset() { - *x = RecursiveType{} - mi := &file_product_proto_msgTypes[60] +func (x *QueryAuthorsWithFilterRequest) Reset() { + *x = QueryAuthorsWithFilterRequest{} + mi := &file_product_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RecursiveType) String() string { +func (x *QueryAuthorsWithFilterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecursiveType) ProtoMessage() {} +func (*QueryAuthorsWithFilterRequest) ProtoMessage() {} -func (x *RecursiveType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[60] +func (x *QueryAuthorsWithFilterRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2839,57 +2889,85 @@ func (x *RecursiveType) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecursiveType.ProtoReflect.Descriptor instead. -func (*RecursiveType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{60} +// Deprecated: Use QueryAuthorsWithFilterRequest.ProtoReflect.Descriptor instead. +func (*QueryAuthorsWithFilterRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{63} } -func (x *RecursiveType) GetId() string { +func (x *QueryAuthorsWithFilterRequest) GetFilter() *AuthorFilter { if x != nil { - return x.Id + return x.Filter } - return "" + return nil } -func (x *RecursiveType) GetName() string { +// Response message for authorsWithFilter operation. +type QueryAuthorsWithFilterResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + AuthorsWithFilter []*Author `protobuf:"bytes,1,rep,name=authors_with_filter,json=authorsWithFilter,proto3" json:"authors_with_filter,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QueryAuthorsWithFilterResponse) Reset() { + *x = QueryAuthorsWithFilterResponse{} + mi := &file_product_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QueryAuthorsWithFilterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAuthorsWithFilterResponse) ProtoMessage() {} + +func (x *QueryAuthorsWithFilterResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[64] if x != nil { - return x.Name + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *RecursiveType) GetRecursiveType() *RecursiveType { +// Deprecated: Use QueryAuthorsWithFilterResponse.ProtoReflect.Descriptor instead. +func (*QueryAuthorsWithFilterResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{64} +} + +func (x *QueryAuthorsWithFilterResponse) GetAuthorsWithFilter() []*Author { if x != nil { - return x.RecursiveType + return x.AuthorsWithFilter } return nil } -type TypeWithMultipleFilterFields struct { +// Request message for allAuthors operation. +type QueryAllAuthorsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - FilterField_1 string `protobuf:"bytes,3,opt,name=filter_field_1,json=filterField1,proto3" json:"filter_field_1,omitempty"` - FilterField_2 string `protobuf:"bytes,4,opt,name=filter_field_2,json=filterField2,proto3" json:"filter_field_2,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *TypeWithMultipleFilterFields) Reset() { - *x = TypeWithMultipleFilterFields{} - mi := &file_product_proto_msgTypes[61] +func (x *QueryAllAuthorsRequest) Reset() { + *x = QueryAllAuthorsRequest{} + mi := &file_product_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *TypeWithMultipleFilterFields) String() string { +func (x *QueryAllAuthorsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TypeWithMultipleFilterFields) ProtoMessage() {} +func (*QueryAllAuthorsRequest) ProtoMessage() {} -func (x *TypeWithMultipleFilterFields) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[61] +func (x *QueryAllAuthorsRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2900,62 +2978,34 @@ func (x *TypeWithMultipleFilterFields) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TypeWithMultipleFilterFields.ProtoReflect.Descriptor instead. -func (*TypeWithMultipleFilterFields) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{61} +// Deprecated: Use QueryAllAuthorsRequest.ProtoReflect.Descriptor instead. +func (*QueryAllAuthorsRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{65} } -func (x *TypeWithMultipleFilterFields) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *TypeWithMultipleFilterFields) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *TypeWithMultipleFilterFields) GetFilterField_1() string { - if x != nil { - return x.FilterField_1 - } - return "" -} - -func (x *TypeWithMultipleFilterFields) GetFilterField_2() string { - if x != nil { - return x.FilterField_2 - } - return "" -} - -type FilterTypeInput struct { +// Response message for allAuthors operation. +type QueryAllAuthorsResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - FilterField_1 string `protobuf:"bytes,1,opt,name=filter_field_1,json=filterField1,proto3" json:"filter_field_1,omitempty"` - FilterField_2 string `protobuf:"bytes,2,opt,name=filter_field_2,json=filterField2,proto3" json:"filter_field_2,omitempty"` + AllAuthors []*Author `protobuf:"bytes,1,rep,name=all_authors,json=allAuthors,proto3" json:"all_authors,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *FilterTypeInput) Reset() { - *x = FilterTypeInput{} - mi := &file_product_proto_msgTypes[62] +func (x *QueryAllAuthorsResponse) Reset() { + *x = QueryAllAuthorsResponse{} + mi := &file_product_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *FilterTypeInput) String() string { +func (x *QueryAllAuthorsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FilterTypeInput) ProtoMessage() {} +func (*QueryAllAuthorsResponse) ProtoMessage() {} -func (x *FilterTypeInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[62] +func (x *QueryAllAuthorsResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2966,47 +3016,41 @@ func (x *FilterTypeInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FilterTypeInput.ProtoReflect.Descriptor instead. -func (*FilterTypeInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{62} -} - -func (x *FilterTypeInput) GetFilterField_1() string { - if x != nil { - return x.FilterField_1 - } - return "" +// Deprecated: Use QueryAllAuthorsResponse.ProtoReflect.Descriptor instead. +func (*QueryAllAuthorsResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{66} } -func (x *FilterTypeInput) GetFilterField_2() string { +func (x *QueryAllAuthorsResponse) GetAllAuthors() []*Author { if x != nil { - return x.FilterField_2 + return x.AllAuthors } - return "" + return nil } -type ComplexFilterTypeInput struct { +// Request message for createUser operation. +type MutationCreateUserRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Filter *FilterType `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` + Input *UserInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ComplexFilterTypeInput) Reset() { - *x = ComplexFilterTypeInput{} - mi := &file_product_proto_msgTypes[63] +func (x *MutationCreateUserRequest) Reset() { + *x = MutationCreateUserRequest{} + mi := &file_product_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ComplexFilterTypeInput) String() string { +func (x *MutationCreateUserRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ComplexFilterTypeInput) ProtoMessage() {} +func (*MutationCreateUserRequest) ProtoMessage() {} -func (x *ComplexFilterTypeInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[63] +func (x *MutationCreateUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3017,41 +3061,41 @@ func (x *ComplexFilterTypeInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ComplexFilterTypeInput.ProtoReflect.Descriptor instead. -func (*ComplexFilterTypeInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{63} +// Deprecated: Use MutationCreateUserRequest.ProtoReflect.Descriptor instead. +func (*MutationCreateUserRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{67} } -func (x *ComplexFilterTypeInput) GetFilter() *FilterType { +func (x *MutationCreateUserRequest) GetInput() *UserInput { if x != nil { - return x.Filter + return x.Input } return nil } -type TypeWithComplexFilterInput struct { +// Response message for createUser operation. +type MutationCreateUserResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + CreateUser *User `protobuf:"bytes,1,opt,name=create_user,json=createUser,proto3" json:"create_user,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *TypeWithComplexFilterInput) Reset() { - *x = TypeWithComplexFilterInput{} - mi := &file_product_proto_msgTypes[64] +func (x *MutationCreateUserResponse) Reset() { + *x = MutationCreateUserResponse{} + mi := &file_product_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *TypeWithComplexFilterInput) String() string { +func (x *MutationCreateUserResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TypeWithComplexFilterInput) ProtoMessage() {} +func (*MutationCreateUserResponse) ProtoMessage() {} -func (x *TypeWithComplexFilterInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[64] +func (x *MutationCreateUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3062,49 +3106,41 @@ func (x *TypeWithComplexFilterInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TypeWithComplexFilterInput.ProtoReflect.Descriptor instead. -func (*TypeWithComplexFilterInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{64} -} - -func (x *TypeWithComplexFilterInput) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use MutationCreateUserResponse.ProtoReflect.Descriptor instead. +func (*MutationCreateUserResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{68} } -func (x *TypeWithComplexFilterInput) GetName() string { +func (x *MutationCreateUserResponse) GetCreateUser() *User { if x != nil { - return x.Name + return x.CreateUser } - return "" + return nil } -type OrderInput struct { +// Request message for performAction operation. +type MutationPerformActionRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"` - CustomerName string `protobuf:"bytes,2,opt,name=customer_name,json=customerName,proto3" json:"customer_name,omitempty"` - Lines []*OrderLineInput `protobuf:"bytes,3,rep,name=lines,proto3" json:"lines,omitempty"` + Input *ActionInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *OrderInput) Reset() { - *x = OrderInput{} - mi := &file_product_proto_msgTypes[65] +func (x *MutationPerformActionRequest) Reset() { + *x = MutationPerformActionRequest{} + mi := &file_product_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *OrderInput) String() string { +func (x *MutationPerformActionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OrderInput) ProtoMessage() {} +func (*MutationPerformActionRequest) ProtoMessage() {} -func (x *OrderInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[65] +func (x *MutationPerformActionRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3115,57 +3151,41 @@ func (x *OrderInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OrderInput.ProtoReflect.Descriptor instead. -func (*OrderInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{65} -} - -func (x *OrderInput) GetOrderId() string { - if x != nil { - return x.OrderId - } - return "" -} - -func (x *OrderInput) GetCustomerName() string { - if x != nil { - return x.CustomerName - } - return "" +// Deprecated: Use MutationPerformActionRequest.ProtoReflect.Descriptor instead. +func (*MutationPerformActionRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{69} } -func (x *OrderInput) GetLines() []*OrderLineInput { +func (x *MutationPerformActionRequest) GetInput() *ActionInput { if x != nil { - return x.Lines + return x.Input } return nil } -type Order struct { +// Response message for performAction operation. +type MutationPerformActionResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"` - CustomerName string `protobuf:"bytes,2,opt,name=customer_name,json=customerName,proto3" json:"customer_name,omitempty"` - TotalItems int32 `protobuf:"varint,3,opt,name=total_items,json=totalItems,proto3" json:"total_items,omitempty"` - OrderLines *ListOfOrderLine `protobuf:"bytes,4,opt,name=order_lines,json=orderLines,proto3" json:"order_lines,omitempty"` + PerformAction *ActionResult `protobuf:"bytes,1,opt,name=perform_action,json=performAction,proto3" json:"perform_action,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *Order) Reset() { - *x = Order{} - mi := &file_product_proto_msgTypes[66] +func (x *MutationPerformActionResponse) Reset() { + *x = MutationPerformActionResponse{} + mi := &file_product_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Order) String() string { +func (x *MutationPerformActionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Order) ProtoMessage() {} +func (*MutationPerformActionResponse) ProtoMessage() {} -func (x *Order) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[66] +func (x *MutationPerformActionResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3176,63 +3196,41 @@ func (x *Order) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Order.ProtoReflect.Descriptor instead. -func (*Order) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{66} -} - -func (x *Order) GetOrderId() string { - if x != nil { - return x.OrderId - } - return "" -} - -func (x *Order) GetCustomerName() string { - if x != nil { - return x.CustomerName - } - return "" -} - -func (x *Order) GetTotalItems() int32 { - if x != nil { - return x.TotalItems - } - return 0 +// Deprecated: Use MutationPerformActionResponse.ProtoReflect.Descriptor instead. +func (*MutationPerformActionResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{70} } -func (x *Order) GetOrderLines() *ListOfOrderLine { +func (x *MutationPerformActionResponse) GetPerformAction() *ActionResult { if x != nil { - return x.OrderLines + return x.PerformAction } return nil } -type Category struct { +// Request message for createNullableFieldsType operation. +type MutationCreateNullableFieldsTypeRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Kind CategoryKind `protobuf:"varint,3,opt,name=kind,proto3,enum=productv1.CategoryKind" json:"kind,omitempty"` + Input *NullableFieldsInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *Category) Reset() { - *x = Category{} - mi := &file_product_proto_msgTypes[67] +func (x *MutationCreateNullableFieldsTypeRequest) Reset() { + *x = MutationCreateNullableFieldsTypeRequest{} + mi := &file_product_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Category) String() string { +func (x *MutationCreateNullableFieldsTypeRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Category) ProtoMessage() {} +func (*MutationCreateNullableFieldsTypeRequest) ProtoMessage() {} -func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[67] +func (x *MutationCreateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3243,55 +3241,87 @@ func (x *Category) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Category.ProtoReflect.Descriptor instead. -func (*Category) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{67} -} - -func (x *Category) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use MutationCreateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. +func (*MutationCreateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{71} } -func (x *Category) GetName() string { +func (x *MutationCreateNullableFieldsTypeRequest) GetInput() *NullableFieldsInput { if x != nil { - return x.Name + return x.Input } - return "" + return nil } -func (x *Category) GetKind() CategoryKind { +// Response message for createNullableFieldsType operation. +type MutationCreateNullableFieldsTypeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CreateNullableFieldsType *NullableFieldsType `protobuf:"bytes,1,opt,name=create_nullable_fields_type,json=createNullableFieldsType,proto3" json:"create_nullable_fields_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationCreateNullableFieldsTypeResponse) Reset() { + *x = MutationCreateNullableFieldsTypeResponse{} + mi := &file_product_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MutationCreateNullableFieldsTypeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationCreateNullableFieldsTypeResponse) ProtoMessage() {} + +func (x *MutationCreateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[72] if x != nil { - return x.Kind + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return CategoryKind_CATEGORY_KIND_UNSPECIFIED + return mi.MessageOf(x) } -type CategoryFilter struct { +// Deprecated: Use MutationCreateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. +func (*MutationCreateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{72} +} + +func (x *MutationCreateNullableFieldsTypeResponse) GetCreateNullableFieldsType() *NullableFieldsType { + if x != nil { + return x.CreateNullableFieldsType + } + return nil +} + +// Request message for updateNullableFieldsType operation. +type MutationUpdateNullableFieldsTypeRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Category CategoryKind `protobuf:"varint,1,opt,name=category,proto3,enum=productv1.CategoryKind" json:"category,omitempty"` - Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Input *NullableFieldsInput `protobuf:"bytes,2,opt,name=input,proto3" json:"input,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *CategoryFilter) Reset() { - *x = CategoryFilter{} - mi := &file_product_proto_msgTypes[68] +func (x *MutationUpdateNullableFieldsTypeRequest) Reset() { + *x = MutationUpdateNullableFieldsTypeRequest{} + mi := &file_product_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CategoryFilter) String() string { +func (x *MutationUpdateNullableFieldsTypeRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CategoryFilter) ProtoMessage() {} +func (*MutationUpdateNullableFieldsTypeRequest) ProtoMessage() {} -func (x *CategoryFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[68] +func (x *MutationUpdateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3302,51 +3332,48 @@ func (x *CategoryFilter) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CategoryFilter.ProtoReflect.Descriptor instead. -func (*CategoryFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{68} +// Deprecated: Use MutationUpdateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. +func (*MutationUpdateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{73} } -func (x *CategoryFilter) GetCategory() CategoryKind { +func (x *MutationUpdateNullableFieldsTypeRequest) GetId() string { if x != nil { - return x.Category + return x.Id } - return CategoryKind_CATEGORY_KIND_UNSPECIFIED + return "" } -func (x *CategoryFilter) GetPagination() *Pagination { +func (x *MutationUpdateNullableFieldsTypeRequest) GetInput() *NullableFieldsInput { if x != nil { - return x.Pagination + return x.Input } return nil } -type Animal struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Instance: - // - // *Animal_Cat - // *Animal_Dog - Instance isAnimal_Instance `protobuf_oneof:"instance"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +// Response message for updateNullableFieldsType operation. +type MutationUpdateNullableFieldsTypeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + UpdateNullableFieldsType *NullableFieldsType `protobuf:"bytes,1,opt,name=update_nullable_fields_type,json=updateNullableFieldsType,proto3" json:"update_nullable_fields_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Animal) Reset() { - *x = Animal{} - mi := &file_product_proto_msgTypes[69] +func (x *MutationUpdateNullableFieldsTypeResponse) Reset() { + *x = MutationUpdateNullableFieldsTypeResponse{} + mi := &file_product_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Animal) String() string { +func (x *MutationUpdateNullableFieldsTypeResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Animal) ProtoMessage() {} +func (*MutationUpdateNullableFieldsTypeResponse) ProtoMessage() {} -func (x *Animal) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[69] +func (x *MutationUpdateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3357,75 +3384,132 @@ func (x *Animal) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Animal.ProtoReflect.Descriptor instead. -func (*Animal) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{69} +// Deprecated: Use MutationUpdateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. +func (*MutationUpdateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{74} } -func (x *Animal) GetInstance() isAnimal_Instance { +func (x *MutationUpdateNullableFieldsTypeResponse) GetUpdateNullableFieldsType() *NullableFieldsType { if x != nil { - return x.Instance + return x.UpdateNullableFieldsType } return nil } -func (x *Animal) GetCat() *Cat { +// Request message for createBlogPost operation. +type MutationCreateBlogPostRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Input *BlogPostInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationCreateBlogPostRequest) Reset() { + *x = MutationCreateBlogPostRequest{} + mi := &file_product_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MutationCreateBlogPostRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationCreateBlogPostRequest) ProtoMessage() {} + +func (x *MutationCreateBlogPostRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[75] if x != nil { - if x, ok := x.Instance.(*Animal_Cat); ok { - return x.Cat + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms } - return nil + return mi.MessageOf(x) } -func (x *Animal) GetDog() *Dog { +// Deprecated: Use MutationCreateBlogPostRequest.ProtoReflect.Descriptor instead. +func (*MutationCreateBlogPostRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{75} +} + +func (x *MutationCreateBlogPostRequest) GetInput() *BlogPostInput { if x != nil { - if x, ok := x.Instance.(*Animal_Dog); ok { - return x.Dog - } + return x.Input } return nil } -type isAnimal_Instance interface { - isAnimal_Instance() +// Response message for createBlogPost operation. +type MutationCreateBlogPostResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CreateBlogPost *BlogPost `protobuf:"bytes,1,opt,name=create_blog_post,json=createBlogPost,proto3" json:"create_blog_post,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -type Animal_Cat struct { - Cat *Cat `protobuf:"bytes,1,opt,name=cat,proto3,oneof"` +func (x *MutationCreateBlogPostResponse) Reset() { + *x = MutationCreateBlogPostResponse{} + mi := &file_product_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -type Animal_Dog struct { - Dog *Dog `protobuf:"bytes,2,opt,name=dog,proto3,oneof"` +func (x *MutationCreateBlogPostResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*Animal_Cat) isAnimal_Instance() {} +func (*MutationCreateBlogPostResponse) ProtoMessage() {} -func (*Animal_Dog) isAnimal_Instance() {} +func (x *MutationCreateBlogPostResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[76] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} -type SearchInput struct { +// Deprecated: Use MutationCreateBlogPostResponse.ProtoReflect.Descriptor instead. +func (*MutationCreateBlogPostResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{76} +} + +func (x *MutationCreateBlogPostResponse) GetCreateBlogPost() *BlogPost { + if x != nil { + return x.CreateBlogPost + } + return nil +} + +// Request message for updateBlogPost operation. +type MutationUpdateBlogPostRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` - Limit *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=limit,proto3" json:"limit,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Input *BlogPostInput `protobuf:"bytes,2,opt,name=input,proto3" json:"input,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *SearchInput) Reset() { - *x = SearchInput{} - mi := &file_product_proto_msgTypes[70] +func (x *MutationUpdateBlogPostRequest) Reset() { + *x = MutationUpdateBlogPostRequest{} + mi := &file_product_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *SearchInput) String() string { +func (x *MutationUpdateBlogPostRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchInput) ProtoMessage() {} +func (*MutationUpdateBlogPostRequest) ProtoMessage() {} -func (x *SearchInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[70] +func (x *MutationUpdateBlogPostRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3436,52 +3520,48 @@ func (x *SearchInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SearchInput.ProtoReflect.Descriptor instead. -func (*SearchInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{70} +// Deprecated: Use MutationUpdateBlogPostRequest.ProtoReflect.Descriptor instead. +func (*MutationUpdateBlogPostRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{77} } -func (x *SearchInput) GetQuery() string { +func (x *MutationUpdateBlogPostRequest) GetId() string { if x != nil { - return x.Query + return x.Id } return "" } -func (x *SearchInput) GetLimit() *wrapperspb.Int32Value { +func (x *MutationUpdateBlogPostRequest) GetInput() *BlogPostInput { if x != nil { - return x.Limit + return x.Input } return nil } -type SearchResult struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Value: - // - // *SearchResult_Product - // *SearchResult_User - // *SearchResult_Category - Value isSearchResult_Value `protobuf_oneof:"value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +// Response message for updateBlogPost operation. +type MutationUpdateBlogPostResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + UpdateBlogPost *BlogPost `protobuf:"bytes,1,opt,name=update_blog_post,json=updateBlogPost,proto3" json:"update_blog_post,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *SearchResult) Reset() { - *x = SearchResult{} - mi := &file_product_proto_msgTypes[71] +func (x *MutationUpdateBlogPostResponse) Reset() { + *x = MutationUpdateBlogPostResponse{} + mi := &file_product_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *SearchResult) String() string { +func (x *MutationUpdateBlogPostResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchResult) ProtoMessage() {} +func (*MutationUpdateBlogPostResponse) ProtoMessage() {} -func (x *SearchResult) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[71] +func (x *MutationUpdateBlogPostResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3492,96 +3572,132 @@ func (x *SearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SearchResult.ProtoReflect.Descriptor instead. -func (*SearchResult) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{71} +// Deprecated: Use MutationUpdateBlogPostResponse.ProtoReflect.Descriptor instead. +func (*MutationUpdateBlogPostResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{78} } -func (x *SearchResult) GetValue() isSearchResult_Value { +func (x *MutationUpdateBlogPostResponse) GetUpdateBlogPost() *BlogPost { if x != nil { - return x.Value + return x.UpdateBlogPost } return nil } -func (x *SearchResult) GetProduct() *Product { - if x != nil { - if x, ok := x.Value.(*SearchResult_Product); ok { - return x.Product - } - } - return nil +// Request message for createAuthor operation. +type MutationCreateAuthorRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Input *AuthorInput `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *SearchResult) GetUser() *User { - if x != nil { - if x, ok := x.Value.(*SearchResult_User); ok { - return x.User - } - } - return nil +func (x *MutationCreateAuthorRequest) Reset() { + *x = MutationCreateAuthorRequest{} + mi := &file_product_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *SearchResult) GetCategory() *Category { - if x != nil { - if x, ok := x.Value.(*SearchResult_Category); ok { - return x.Category +func (x *MutationCreateAuthorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationCreateAuthorRequest) ProtoMessage() {} + +func (x *MutationCreateAuthorRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[79] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms } - return nil + return mi.MessageOf(x) } -type isSearchResult_Value interface { - isSearchResult_Value() +// Deprecated: Use MutationCreateAuthorRequest.ProtoReflect.Descriptor instead. +func (*MutationCreateAuthorRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{79} } -type SearchResult_Product struct { - Product *Product `protobuf:"bytes,1,opt,name=product,proto3,oneof"` +func (x *MutationCreateAuthorRequest) GetInput() *AuthorInput { + if x != nil { + return x.Input + } + return nil } -type SearchResult_User struct { - User *User `protobuf:"bytes,2,opt,name=user,proto3,oneof"` +// Response message for createAuthor operation. +type MutationCreateAuthorResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CreateAuthor *Author `protobuf:"bytes,1,opt,name=create_author,json=createAuthor,proto3" json:"create_author,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -type SearchResult_Category struct { - Category *Category `protobuf:"bytes,3,opt,name=category,proto3,oneof"` +func (x *MutationCreateAuthorResponse) Reset() { + *x = MutationCreateAuthorResponse{} + mi := &file_product_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (*SearchResult_Product) isSearchResult_Value() {} +func (x *MutationCreateAuthorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} -func (*SearchResult_User) isSearchResult_Value() {} +func (*MutationCreateAuthorResponse) ProtoMessage() {} -func (*SearchResult_Category) isSearchResult_Value() {} +func (x *MutationCreateAuthorResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[80] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} -type NullableFieldsType struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - OptionalString *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` - OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,4,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` - OptionalFloat *wrapperspb.DoubleValue `protobuf:"bytes,5,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` - OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` - RequiredString string `protobuf:"bytes,7,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` - RequiredInt int32 `protobuf:"varint,8,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +// Deprecated: Use MutationCreateAuthorResponse.ProtoReflect.Descriptor instead. +func (*MutationCreateAuthorResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{80} } -func (x *NullableFieldsType) Reset() { - *x = NullableFieldsType{} - mi := &file_product_proto_msgTypes[72] +func (x *MutationCreateAuthorResponse) GetCreateAuthor() *Author { + if x != nil { + return x.CreateAuthor + } + return nil +} + +// Request message for updateAuthor operation. +type MutationUpdateAuthorRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Input *AuthorInput `protobuf:"bytes,2,opt,name=input,proto3" json:"input,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationUpdateAuthorRequest) Reset() { + *x = MutationUpdateAuthorRequest{} + mi := &file_product_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *NullableFieldsType) String() string { +func (x *MutationUpdateAuthorRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NullableFieldsType) ProtoMessage() {} +func (*MutationUpdateAuthorRequest) ProtoMessage() {} -func (x *NullableFieldsType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[72] +func (x *MutationUpdateAuthorRequest) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3592,91 +3708,154 @@ func (x *NullableFieldsType) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NullableFieldsType.ProtoReflect.Descriptor instead. -func (*NullableFieldsType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{72} +// Deprecated: Use MutationUpdateAuthorRequest.ProtoReflect.Descriptor instead. +func (*MutationUpdateAuthorRequest) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{81} } -func (x *NullableFieldsType) GetId() string { +func (x *MutationUpdateAuthorRequest) GetId() string { if x != nil { return x.Id } return "" } -func (x *NullableFieldsType) GetName() string { +func (x *MutationUpdateAuthorRequest) GetInput() *AuthorInput { if x != nil { - return x.Name + return x.Input } - return "" + return nil } -func (x *NullableFieldsType) GetOptionalString() *wrapperspb.StringValue { +// Response message for updateAuthor operation. +type MutationUpdateAuthorResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + UpdateAuthor *Author `protobuf:"bytes,1,opt,name=update_author,json=updateAuthor,proto3" json:"update_author,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MutationUpdateAuthorResponse) Reset() { + *x = MutationUpdateAuthorResponse{} + mi := &file_product_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MutationUpdateAuthorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationUpdateAuthorResponse) ProtoMessage() {} + +func (x *MutationUpdateAuthorResponse) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[82] if x != nil { - return x.OptionalString + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NullableFieldsType) GetOptionalInt() *wrapperspb.Int32Value { +// Deprecated: Use MutationUpdateAuthorResponse.ProtoReflect.Descriptor instead. +func (*MutationUpdateAuthorResponse) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{82} +} + +func (x *MutationUpdateAuthorResponse) GetUpdateAuthor() *Author { if x != nil { - return x.OptionalInt + return x.UpdateAuthor } return nil } -func (x *NullableFieldsType) GetOptionalFloat() *wrapperspb.DoubleValue { +type Product struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Price float64 `protobuf:"fixed64,3,opt,name=price,proto3" json:"price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Product) Reset() { + *x = Product{} + mi := &file_product_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Product) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Product) ProtoMessage() {} + +func (x *Product) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[83] if x != nil { - return x.OptionalFloat + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NullableFieldsType) GetOptionalBoolean() *wrapperspb.BoolValue { +// Deprecated: Use Product.ProtoReflect.Descriptor instead. +func (*Product) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{83} +} + +func (x *Product) GetId() string { if x != nil { - return x.OptionalBoolean + return x.Id } - return nil + return "" } -func (x *NullableFieldsType) GetRequiredString() string { +func (x *Product) GetName() string { if x != nil { - return x.RequiredString + return x.Name } return "" } -func (x *NullableFieldsType) GetRequiredInt() int32 { +func (x *Product) GetPrice() float64 { if x != nil { - return x.RequiredInt + return x.Price } return 0 } -type NullableFieldsFilter struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` - IncludeNulls *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=include_nulls,json=includeNulls,proto3" json:"include_nulls,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type Storage struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Location string `protobuf:"bytes,3,opt,name=location,proto3" json:"location,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *NullableFieldsFilter) Reset() { - *x = NullableFieldsFilter{} - mi := &file_product_proto_msgTypes[73] +func (x *Storage) Reset() { + *x = Storage{} + mi := &file_product_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *NullableFieldsFilter) String() string { +func (x *Storage) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NullableFieldsFilter) ProtoMessage() {} +func (*Storage) ProtoMessage() {} -func (x *NullableFieldsFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[73] +func (x *Storage) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3687,54 +3866,55 @@ func (x *NullableFieldsFilter) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NullableFieldsFilter.ProtoReflect.Descriptor instead. -func (*NullableFieldsFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{73} +// Deprecated: Use Storage.ProtoReflect.Descriptor instead. +func (*Storage) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{84} } -func (x *NullableFieldsFilter) GetName() *wrapperspb.StringValue { +func (x *Storage) GetId() string { if x != nil { - return x.Name + return x.Id } - return nil + return "" } -func (x *NullableFieldsFilter) GetOptionalString() *wrapperspb.StringValue { +func (x *Storage) GetName() string { if x != nil { - return x.OptionalString + return x.Name } - return nil + return "" } -func (x *NullableFieldsFilter) GetIncludeNulls() *wrapperspb.BoolValue { +func (x *Storage) GetLocation() string { if x != nil { - return x.IncludeNulls + return x.Location } - return nil + return "" } -type UserInput struct { +type User struct { state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *UserInput) Reset() { - *x = UserInput{} - mi := &file_product_proto_msgTypes[74] +func (x *User) Reset() { + *x = User{} + mi := &file_product_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UserInput) String() string { +func (x *User) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UserInput) ProtoMessage() {} +func (*User) ProtoMessage() {} -func (x *UserInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[74] +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3742,44 +3922,1668 @@ func (x *UserInput) ProtoReflect() protoreflect.Message { } return ms } - return mi.MessageOf(x) + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{85} +} + +func (x *User) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type NestedTypeA struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + B *NestedTypeB `protobuf:"bytes,3,opt,name=b,proto3" json:"b,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NestedTypeA) Reset() { + *x = NestedTypeA{} + mi := &file_product_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NestedTypeA) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NestedTypeA) ProtoMessage() {} + +func (x *NestedTypeA) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[86] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NestedTypeA.ProtoReflect.Descriptor instead. +func (*NestedTypeA) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{86} +} + +func (x *NestedTypeA) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *NestedTypeA) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NestedTypeA) GetB() *NestedTypeB { + if x != nil { + return x.B + } + return nil +} + +type RecursiveType struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + RecursiveType *RecursiveType `protobuf:"bytes,3,opt,name=recursive_type,json=recursiveType,proto3" json:"recursive_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RecursiveType) Reset() { + *x = RecursiveType{} + mi := &file_product_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RecursiveType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecursiveType) ProtoMessage() {} + +func (x *RecursiveType) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[87] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecursiveType.ProtoReflect.Descriptor instead. +func (*RecursiveType) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{87} +} + +func (x *RecursiveType) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *RecursiveType) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RecursiveType) GetRecursiveType() *RecursiveType { + if x != nil { + return x.RecursiveType + } + return nil +} + +type TypeWithMultipleFilterFields struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + FilterField_1 string `protobuf:"bytes,3,opt,name=filter_field_1,json=filterField1,proto3" json:"filter_field_1,omitempty"` + FilterField_2 string `protobuf:"bytes,4,opt,name=filter_field_2,json=filterField2,proto3" json:"filter_field_2,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TypeWithMultipleFilterFields) Reset() { + *x = TypeWithMultipleFilterFields{} + mi := &file_product_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TypeWithMultipleFilterFields) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TypeWithMultipleFilterFields) ProtoMessage() {} + +func (x *TypeWithMultipleFilterFields) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[88] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TypeWithMultipleFilterFields.ProtoReflect.Descriptor instead. +func (*TypeWithMultipleFilterFields) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{88} +} + +func (x *TypeWithMultipleFilterFields) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *TypeWithMultipleFilterFields) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *TypeWithMultipleFilterFields) GetFilterField_1() string { + if x != nil { + return x.FilterField_1 + } + return "" +} + +func (x *TypeWithMultipleFilterFields) GetFilterField_2() string { + if x != nil { + return x.FilterField_2 + } + return "" +} + +type FilterTypeInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + FilterField_1 string `protobuf:"bytes,1,opt,name=filter_field_1,json=filterField1,proto3" json:"filter_field_1,omitempty"` + FilterField_2 string `protobuf:"bytes,2,opt,name=filter_field_2,json=filterField2,proto3" json:"filter_field_2,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FilterTypeInput) Reset() { + *x = FilterTypeInput{} + mi := &file_product_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FilterTypeInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FilterTypeInput) ProtoMessage() {} + +func (x *FilterTypeInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[89] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FilterTypeInput.ProtoReflect.Descriptor instead. +func (*FilterTypeInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{89} +} + +func (x *FilterTypeInput) GetFilterField_1() string { + if x != nil { + return x.FilterField_1 + } + return "" +} + +func (x *FilterTypeInput) GetFilterField_2() string { + if x != nil { + return x.FilterField_2 + } + return "" +} + +type ComplexFilterTypeInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Filter *FilterType `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ComplexFilterTypeInput) Reset() { + *x = ComplexFilterTypeInput{} + mi := &file_product_proto_msgTypes[90] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ComplexFilterTypeInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComplexFilterTypeInput) ProtoMessage() {} + +func (x *ComplexFilterTypeInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[90] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComplexFilterTypeInput.ProtoReflect.Descriptor instead. +func (*ComplexFilterTypeInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{90} +} + +func (x *ComplexFilterTypeInput) GetFilter() *FilterType { + if x != nil { + return x.Filter + } + return nil +} + +type TypeWithComplexFilterInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TypeWithComplexFilterInput) Reset() { + *x = TypeWithComplexFilterInput{} + mi := &file_product_proto_msgTypes[91] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TypeWithComplexFilterInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TypeWithComplexFilterInput) ProtoMessage() {} + +func (x *TypeWithComplexFilterInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[91] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TypeWithComplexFilterInput.ProtoReflect.Descriptor instead. +func (*TypeWithComplexFilterInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{91} +} + +func (x *TypeWithComplexFilterInput) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *TypeWithComplexFilterInput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type OrderInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"` + CustomerName string `protobuf:"bytes,2,opt,name=customer_name,json=customerName,proto3" json:"customer_name,omitempty"` + Lines []*OrderLineInput `protobuf:"bytes,3,rep,name=lines,proto3" json:"lines,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OrderInput) Reset() { + *x = OrderInput{} + mi := &file_product_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OrderInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OrderInput) ProtoMessage() {} + +func (x *OrderInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[92] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OrderInput.ProtoReflect.Descriptor instead. +func (*OrderInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{92} +} + +func (x *OrderInput) GetOrderId() string { + if x != nil { + return x.OrderId + } + return "" +} + +func (x *OrderInput) GetCustomerName() string { + if x != nil { + return x.CustomerName + } + return "" +} + +func (x *OrderInput) GetLines() []*OrderLineInput { + if x != nil { + return x.Lines + } + return nil +} + +type Order struct { + state protoimpl.MessageState `protogen:"open.v1"` + OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"` + CustomerName string `protobuf:"bytes,2,opt,name=customer_name,json=customerName,proto3" json:"customer_name,omitempty"` + TotalItems int32 `protobuf:"varint,3,opt,name=total_items,json=totalItems,proto3" json:"total_items,omitempty"` + OrderLines *ListOfOrderLine `protobuf:"bytes,4,opt,name=order_lines,json=orderLines,proto3" json:"order_lines,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Order) Reset() { + *x = Order{} + mi := &file_product_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Order) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Order) ProtoMessage() {} + +func (x *Order) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[93] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Order.ProtoReflect.Descriptor instead. +func (*Order) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{93} +} + +func (x *Order) GetOrderId() string { + if x != nil { + return x.OrderId + } + return "" +} + +func (x *Order) GetCustomerName() string { + if x != nil { + return x.CustomerName + } + return "" +} + +func (x *Order) GetTotalItems() int32 { + if x != nil { + return x.TotalItems + } + return 0 +} + +func (x *Order) GetOrderLines() *ListOfOrderLine { + if x != nil { + return x.OrderLines + } + return nil +} + +type Category struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Kind CategoryKind `protobuf:"varint,3,opt,name=kind,proto3,enum=productv1.CategoryKind" json:"kind,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Category) Reset() { + *x = Category{} + mi := &file_product_proto_msgTypes[94] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Category) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Category) ProtoMessage() {} + +func (x *Category) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[94] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Category.ProtoReflect.Descriptor instead. +func (*Category) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{94} +} + +func (x *Category) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Category) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Category) GetKind() CategoryKind { + if x != nil { + return x.Kind + } + return CategoryKind_CATEGORY_KIND_UNSPECIFIED +} + +type CategoryFilter struct { + state protoimpl.MessageState `protogen:"open.v1"` + Category CategoryKind `protobuf:"varint,1,opt,name=category,proto3,enum=productv1.CategoryKind" json:"category,omitempty"` + Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CategoryFilter) Reset() { + *x = CategoryFilter{} + mi := &file_product_proto_msgTypes[95] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CategoryFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CategoryFilter) ProtoMessage() {} + +func (x *CategoryFilter) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[95] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CategoryFilter.ProtoReflect.Descriptor instead. +func (*CategoryFilter) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{95} +} + +func (x *CategoryFilter) GetCategory() CategoryKind { + if x != nil { + return x.Category + } + return CategoryKind_CATEGORY_KIND_UNSPECIFIED +} + +func (x *CategoryFilter) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +type Animal struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Instance: + // + // *Animal_Cat + // *Animal_Dog + Instance isAnimal_Instance `protobuf_oneof:"instance"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Animal) Reset() { + *x = Animal{} + mi := &file_product_proto_msgTypes[96] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Animal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Animal) ProtoMessage() {} + +func (x *Animal) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[96] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Animal.ProtoReflect.Descriptor instead. +func (*Animal) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{96} +} + +func (x *Animal) GetInstance() isAnimal_Instance { + if x != nil { + return x.Instance + } + return nil +} + +func (x *Animal) GetCat() *Cat { + if x != nil { + if x, ok := x.Instance.(*Animal_Cat); ok { + return x.Cat + } + } + return nil +} + +func (x *Animal) GetDog() *Dog { + if x != nil { + if x, ok := x.Instance.(*Animal_Dog); ok { + return x.Dog + } + } + return nil +} + +type isAnimal_Instance interface { + isAnimal_Instance() +} + +type Animal_Cat struct { + Cat *Cat `protobuf:"bytes,1,opt,name=cat,proto3,oneof"` +} + +type Animal_Dog struct { + Dog *Dog `protobuf:"bytes,2,opt,name=dog,proto3,oneof"` +} + +func (*Animal_Cat) isAnimal_Instance() {} + +func (*Animal_Dog) isAnimal_Instance() {} + +type SearchInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + Limit *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=limit,proto3" json:"limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SearchInput) Reset() { + *x = SearchInput{} + mi := &file_product_proto_msgTypes[97] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SearchInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchInput) ProtoMessage() {} + +func (x *SearchInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[97] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchInput.ProtoReflect.Descriptor instead. +func (*SearchInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{97} +} + +func (x *SearchInput) GetQuery() string { + if x != nil { + return x.Query + } + return "" +} + +func (x *SearchInput) GetLimit() *wrapperspb.Int32Value { + if x != nil { + return x.Limit + } + return nil +} + +type SearchResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Value: + // + // *SearchResult_Product + // *SearchResult_User + // *SearchResult_Category + Value isSearchResult_Value `protobuf_oneof:"value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SearchResult) Reset() { + *x = SearchResult{} + mi := &file_product_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SearchResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchResult) ProtoMessage() {} + +func (x *SearchResult) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[98] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchResult.ProtoReflect.Descriptor instead. +func (*SearchResult) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{98} +} + +func (x *SearchResult) GetValue() isSearchResult_Value { + if x != nil { + return x.Value + } + return nil +} + +func (x *SearchResult) GetProduct() *Product { + if x != nil { + if x, ok := x.Value.(*SearchResult_Product); ok { + return x.Product + } + } + return nil +} + +func (x *SearchResult) GetUser() *User { + if x != nil { + if x, ok := x.Value.(*SearchResult_User); ok { + return x.User + } + } + return nil +} + +func (x *SearchResult) GetCategory() *Category { + if x != nil { + if x, ok := x.Value.(*SearchResult_Category); ok { + return x.Category + } + } + return nil +} + +type isSearchResult_Value interface { + isSearchResult_Value() +} + +type SearchResult_Product struct { + Product *Product `protobuf:"bytes,1,opt,name=product,proto3,oneof"` +} + +type SearchResult_User struct { + User *User `protobuf:"bytes,2,opt,name=user,proto3,oneof"` +} + +type SearchResult_Category struct { + Category *Category `protobuf:"bytes,3,opt,name=category,proto3,oneof"` +} + +func (*SearchResult_Product) isSearchResult_Value() {} + +func (*SearchResult_User) isSearchResult_Value() {} + +func (*SearchResult_Category) isSearchResult_Value() {} + +type NullableFieldsType struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + OptionalString *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` + OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,4,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` + OptionalFloat *wrapperspb.DoubleValue `protobuf:"bytes,5,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` + OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` + RequiredString string `protobuf:"bytes,7,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` + RequiredInt int32 `protobuf:"varint,8,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NullableFieldsType) Reset() { + *x = NullableFieldsType{} + mi := &file_product_proto_msgTypes[99] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NullableFieldsType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NullableFieldsType) ProtoMessage() {} + +func (x *NullableFieldsType) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[99] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NullableFieldsType.ProtoReflect.Descriptor instead. +func (*NullableFieldsType) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{99} +} + +func (x *NullableFieldsType) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *NullableFieldsType) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NullableFieldsType) GetOptionalString() *wrapperspb.StringValue { + if x != nil { + return x.OptionalString + } + return nil +} + +func (x *NullableFieldsType) GetOptionalInt() *wrapperspb.Int32Value { + if x != nil { + return x.OptionalInt + } + return nil +} + +func (x *NullableFieldsType) GetOptionalFloat() *wrapperspb.DoubleValue { + if x != nil { + return x.OptionalFloat + } + return nil +} + +func (x *NullableFieldsType) GetOptionalBoolean() *wrapperspb.BoolValue { + if x != nil { + return x.OptionalBoolean + } + return nil +} + +func (x *NullableFieldsType) GetRequiredString() string { + if x != nil { + return x.RequiredString + } + return "" +} + +func (x *NullableFieldsType) GetRequiredInt() int32 { + if x != nil { + return x.RequiredInt + } + return 0 +} + +type NullableFieldsFilter struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` + IncludeNulls *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=include_nulls,json=includeNulls,proto3" json:"include_nulls,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NullableFieldsFilter) Reset() { + *x = NullableFieldsFilter{} + mi := &file_product_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NullableFieldsFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NullableFieldsFilter) ProtoMessage() {} + +func (x *NullableFieldsFilter) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[100] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NullableFieldsFilter.ProtoReflect.Descriptor instead. +func (*NullableFieldsFilter) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{100} +} + +func (x *NullableFieldsFilter) GetName() *wrapperspb.StringValue { + if x != nil { + return x.Name + } + return nil +} + +func (x *NullableFieldsFilter) GetOptionalString() *wrapperspb.StringValue { + if x != nil { + return x.OptionalString + } + return nil +} + +func (x *NullableFieldsFilter) GetIncludeNulls() *wrapperspb.BoolValue { + if x != nil { + return x.IncludeNulls + } + return nil +} + +type BlogPost struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + Tags []string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty"` + OptionalTags *ListOfString `protobuf:"bytes,5,opt,name=optional_tags,json=optionalTags,proto3" json:"optional_tags,omitempty"` + Categories []string `protobuf:"bytes,6,rep,name=categories,proto3" json:"categories,omitempty"` + Keywords *ListOfString `protobuf:"bytes,7,opt,name=keywords,proto3" json:"keywords,omitempty"` + ViewCounts []int32 `protobuf:"varint,8,rep,packed,name=view_counts,json=viewCounts,proto3" json:"view_counts,omitempty"` + Ratings *ListOfFloat `protobuf:"bytes,9,opt,name=ratings,proto3" json:"ratings,omitempty"` + IsPublished *ListOfBoolean `protobuf:"bytes,10,opt,name=is_published,json=isPublished,proto3" json:"is_published,omitempty"` + TagGroups *ListOfListOfString `protobuf:"bytes,11,opt,name=tag_groups,json=tagGroups,proto3" json:"tag_groups,omitempty"` + RelatedTopics *ListOfListOfString `protobuf:"bytes,12,opt,name=related_topics,json=relatedTopics,proto3" json:"related_topics,omitempty"` + CommentThreads *ListOfListOfString `protobuf:"bytes,13,opt,name=comment_threads,json=commentThreads,proto3" json:"comment_threads,omitempty"` + Suggestions *ListOfListOfString `protobuf:"bytes,14,opt,name=suggestions,proto3" json:"suggestions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BlogPost) Reset() { + *x = BlogPost{} + mi := &file_product_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BlogPost) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlogPost) ProtoMessage() {} + +func (x *BlogPost) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[101] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlogPost.ProtoReflect.Descriptor instead. +func (*BlogPost) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{101} +} + +func (x *BlogPost) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *BlogPost) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *BlogPost) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *BlogPost) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *BlogPost) GetOptionalTags() *ListOfString { + if x != nil { + return x.OptionalTags + } + return nil +} + +func (x *BlogPost) GetCategories() []string { + if x != nil { + return x.Categories + } + return nil +} + +func (x *BlogPost) GetKeywords() *ListOfString { + if x != nil { + return x.Keywords + } + return nil +} + +func (x *BlogPost) GetViewCounts() []int32 { + if x != nil { + return x.ViewCounts + } + return nil +} + +func (x *BlogPost) GetRatings() *ListOfFloat { + if x != nil { + return x.Ratings + } + return nil +} + +func (x *BlogPost) GetIsPublished() *ListOfBoolean { + if x != nil { + return x.IsPublished + } + return nil +} + +func (x *BlogPost) GetTagGroups() *ListOfListOfString { + if x != nil { + return x.TagGroups + } + return nil +} + +func (x *BlogPost) GetRelatedTopics() *ListOfListOfString { + if x != nil { + return x.RelatedTopics + } + return nil +} + +func (x *BlogPost) GetCommentThreads() *ListOfListOfString { + if x != nil { + return x.CommentThreads + } + return nil +} + +func (x *BlogPost) GetSuggestions() *ListOfListOfString { + if x != nil { + return x.Suggestions + } + return nil +} + +type BlogPostFilter struct { + state protoimpl.MessageState `protogen:"open.v1"` + Title *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + HasCategories *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=has_categories,json=hasCategories,proto3" json:"has_categories,omitempty"` + MinTags *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=min_tags,json=minTags,proto3" json:"min_tags,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BlogPostFilter) Reset() { + *x = BlogPostFilter{} + mi := &file_product_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BlogPostFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlogPostFilter) ProtoMessage() {} + +func (x *BlogPostFilter) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[102] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlogPostFilter.ProtoReflect.Descriptor instead. +func (*BlogPostFilter) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{102} +} + +func (x *BlogPostFilter) GetTitle() *wrapperspb.StringValue { + if x != nil { + return x.Title + } + return nil +} + +func (x *BlogPostFilter) GetHasCategories() *wrapperspb.BoolValue { + if x != nil { + return x.HasCategories + } + return nil +} + +func (x *BlogPostFilter) GetMinTags() *wrapperspb.Int32Value { + if x != nil { + return x.MinTags + } + return nil +} + +type Author struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Email *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + Skills []string `protobuf:"bytes,4,rep,name=skills,proto3" json:"skills,omitempty"` + Languages []string `protobuf:"bytes,5,rep,name=languages,proto3" json:"languages,omitempty"` + SocialLinks *ListOfString `protobuf:"bytes,6,opt,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` + TeamsByProject *ListOfListOfString `protobuf:"bytes,7,opt,name=teams_by_project,json=teamsByProject,proto3" json:"teams_by_project,omitempty"` + Collaborations *ListOfListOfString `protobuf:"bytes,8,opt,name=collaborations,proto3" json:"collaborations,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Author) Reset() { + *x = Author{} + mi := &file_product_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Author) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Author) ProtoMessage() {} + +func (x *Author) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[103] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Author.ProtoReflect.Descriptor instead. +func (*Author) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{103} +} + +func (x *Author) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Author) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Author) GetEmail() *wrapperspb.StringValue { + if x != nil { + return x.Email + } + return nil +} + +func (x *Author) GetSkills() []string { + if x != nil { + return x.Skills + } + return nil +} + +func (x *Author) GetLanguages() []string { + if x != nil { + return x.Languages + } + return nil +} + +func (x *Author) GetSocialLinks() *ListOfString { + if x != nil { + return x.SocialLinks + } + return nil +} + +func (x *Author) GetTeamsByProject() *ListOfListOfString { + if x != nil { + return x.TeamsByProject + } + return nil +} + +func (x *Author) GetCollaborations() *ListOfListOfString { + if x != nil { + return x.Collaborations + } + return nil +} + +type AuthorFilter struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + HasTeams *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=has_teams,json=hasTeams,proto3" json:"has_teams,omitempty"` + SkillCount *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=skill_count,json=skillCount,proto3" json:"skill_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuthorFilter) Reset() { + *x = AuthorFilter{} + mi := &file_product_proto_msgTypes[104] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuthorFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthorFilter) ProtoMessage() {} + +func (x *AuthorFilter) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[104] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthorFilter.ProtoReflect.Descriptor instead. +func (*AuthorFilter) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{104} +} + +func (x *AuthorFilter) GetName() *wrapperspb.StringValue { + if x != nil { + return x.Name + } + return nil +} + +func (x *AuthorFilter) GetHasTeams() *wrapperspb.BoolValue { + if x != nil { + return x.HasTeams + } + return nil +} + +func (x *AuthorFilter) GetSkillCount() *wrapperspb.Int32Value { + if x != nil { + return x.SkillCount + } + return nil +} + +type UserInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UserInput) Reset() { + *x = UserInput{} + mi := &file_product_proto_msgTypes[105] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UserInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserInput) ProtoMessage() {} + +func (x *UserInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[105] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserInput.ProtoReflect.Descriptor instead. +func (*UserInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{105} +} + +func (x *UserInput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ActionInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ActionInput) Reset() { + *x = ActionInput{} + mi := &file_product_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ActionInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActionInput) ProtoMessage() {} + +func (x *ActionInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[106] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActionInput.ProtoReflect.Descriptor instead. +func (*ActionInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{106} +} + +func (x *ActionInput) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ActionInput) GetPayload() string { + if x != nil { + return x.Payload + } + return "" +} + +type ActionResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Value: + // + // *ActionResult_ActionSuccess + // *ActionResult_ActionError + Value isActionResult_Value `protobuf_oneof:"value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ActionResult) Reset() { + *x = ActionResult{} + mi := &file_product_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ActionResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActionResult) ProtoMessage() {} + +func (x *ActionResult) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[107] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActionResult.ProtoReflect.Descriptor instead. +func (*ActionResult) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{107} +} + +func (x *ActionResult) GetValue() isActionResult_Value { + if x != nil { + return x.Value + } + return nil +} + +func (x *ActionResult) GetActionSuccess() *ActionSuccess { + if x != nil { + if x, ok := x.Value.(*ActionResult_ActionSuccess); ok { + return x.ActionSuccess + } + } + return nil +} + +func (x *ActionResult) GetActionError() *ActionError { + if x != nil { + if x, ok := x.Value.(*ActionResult_ActionError); ok { + return x.ActionError + } + } + return nil +} + +type isActionResult_Value interface { + isActionResult_Value() +} + +type ActionResult_ActionSuccess struct { + ActionSuccess *ActionSuccess `protobuf:"bytes,1,opt,name=action_success,json=actionSuccess,proto3,oneof"` +} + +type ActionResult_ActionError struct { + ActionError *ActionError `protobuf:"bytes,2,opt,name=action_error,json=actionError,proto3,oneof"` +} + +func (*ActionResult_ActionSuccess) isActionResult_Value() {} + +func (*ActionResult_ActionError) isActionResult_Value() {} + +type NullableFieldsInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` + OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` + OptionalFloat *wrapperspb.DoubleValue `protobuf:"bytes,4,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` + OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,5,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` + RequiredString string `protobuf:"bytes,6,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` + RequiredInt int32 `protobuf:"varint,7,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NullableFieldsInput) Reset() { + *x = NullableFieldsInput{} + mi := &file_product_proto_msgTypes[108] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NullableFieldsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NullableFieldsInput) ProtoMessage() {} + +func (x *NullableFieldsInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[108] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NullableFieldsInput.ProtoReflect.Descriptor instead. +func (*NullableFieldsInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{108} +} + +func (x *NullableFieldsInput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NullableFieldsInput) GetOptionalString() *wrapperspb.StringValue { + if x != nil { + return x.OptionalString + } + return nil +} + +func (x *NullableFieldsInput) GetOptionalInt() *wrapperspb.Int32Value { + if x != nil { + return x.OptionalInt + } + return nil +} + +func (x *NullableFieldsInput) GetOptionalFloat() *wrapperspb.DoubleValue { + if x != nil { + return x.OptionalFloat + } + return nil +} + +func (x *NullableFieldsInput) GetOptionalBoolean() *wrapperspb.BoolValue { + if x != nil { + return x.OptionalBoolean + } + return nil } -// Deprecated: Use UserInput.ProtoReflect.Descriptor instead. -func (*UserInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{74} +func (x *NullableFieldsInput) GetRequiredString() string { + if x != nil { + return x.RequiredString + } + return "" } -func (x *UserInput) GetName() string { +func (x *NullableFieldsInput) GetRequiredInt() int32 { if x != nil { - return x.Name + return x.RequiredInt } - return "" + return 0 } -type ActionInput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type BlogPostInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + Tags []string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty"` + OptionalTags *ListOfString `protobuf:"bytes,4,opt,name=optional_tags,json=optionalTags,proto3" json:"optional_tags,omitempty"` + Categories []string `protobuf:"bytes,5,rep,name=categories,proto3" json:"categories,omitempty"` + Keywords *ListOfString `protobuf:"bytes,6,opt,name=keywords,proto3" json:"keywords,omitempty"` + ViewCounts []int32 `protobuf:"varint,7,rep,packed,name=view_counts,json=viewCounts,proto3" json:"view_counts,omitempty"` + Ratings *ListOfFloat `protobuf:"bytes,8,opt,name=ratings,proto3" json:"ratings,omitempty"` + IsPublished *ListOfBoolean `protobuf:"bytes,9,opt,name=is_published,json=isPublished,proto3" json:"is_published,omitempty"` + TagGroups *ListOfListOfString `protobuf:"bytes,10,opt,name=tag_groups,json=tagGroups,proto3" json:"tag_groups,omitempty"` + RelatedTopics *ListOfListOfString `protobuf:"bytes,11,opt,name=related_topics,json=relatedTopics,proto3" json:"related_topics,omitempty"` + CommentThreads *ListOfListOfString `protobuf:"bytes,12,opt,name=comment_threads,json=commentThreads,proto3" json:"comment_threads,omitempty"` + Suggestions *ListOfListOfString `protobuf:"bytes,13,opt,name=suggestions,proto3" json:"suggestions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ActionInput) Reset() { - *x = ActionInput{} - mi := &file_product_proto_msgTypes[75] +func (x *BlogPostInput) Reset() { + *x = BlogPostInput{} + mi := &file_product_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ActionInput) String() string { +func (x *BlogPostInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ActionInput) ProtoMessage() {} +func (*BlogPostInput) ProtoMessage() {} -func (x *ActionInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[75] +func (x *BlogPostInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3790,135 +5594,130 @@ func (x *ActionInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ActionInput.ProtoReflect.Descriptor instead. -func (*ActionInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{75} +// Deprecated: Use BlogPostInput.ProtoReflect.Descriptor instead. +func (*BlogPostInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{109} } -func (x *ActionInput) GetType() string { +func (x *BlogPostInput) GetTitle() string { if x != nil { - return x.Type + return x.Title } return "" } -func (x *ActionInput) GetPayload() string { +func (x *BlogPostInput) GetContent() string { if x != nil { - return x.Payload + return x.Content } return "" } -type ActionResult struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Value: - // - // *ActionResult_ActionSuccess - // *ActionResult_ActionError - Value isActionResult_Value `protobuf_oneof:"value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +func (x *BlogPostInput) GetTags() []string { + if x != nil { + return x.Tags + } + return nil } -func (x *ActionResult) Reset() { - *x = ActionResult{} - mi := &file_product_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *BlogPostInput) GetOptionalTags() *ListOfString { + if x != nil { + return x.OptionalTags + } + return nil } -func (x *ActionResult) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *BlogPostInput) GetCategories() []string { + if x != nil { + return x.Categories + } + return nil } -func (*ActionResult) ProtoMessage() {} - -func (x *ActionResult) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[76] +func (x *BlogPostInput) GetKeywords() *ListOfString { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Keywords } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ActionResult.ProtoReflect.Descriptor instead. -func (*ActionResult) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{76} +func (x *BlogPostInput) GetViewCounts() []int32 { + if x != nil { + return x.ViewCounts + } + return nil } -func (x *ActionResult) GetValue() isActionResult_Value { +func (x *BlogPostInput) GetRatings() *ListOfFloat { if x != nil { - return x.Value + return x.Ratings } return nil } -func (x *ActionResult) GetActionSuccess() *ActionSuccess { +func (x *BlogPostInput) GetIsPublished() *ListOfBoolean { if x != nil { - if x, ok := x.Value.(*ActionResult_ActionSuccess); ok { - return x.ActionSuccess - } + return x.IsPublished } return nil } -func (x *ActionResult) GetActionError() *ActionError { +func (x *BlogPostInput) GetTagGroups() *ListOfListOfString { if x != nil { - if x, ok := x.Value.(*ActionResult_ActionError); ok { - return x.ActionError - } + return x.TagGroups } return nil } -type isActionResult_Value interface { - isActionResult_Value() +func (x *BlogPostInput) GetRelatedTopics() *ListOfListOfString { + if x != nil { + return x.RelatedTopics + } + return nil } -type ActionResult_ActionSuccess struct { - ActionSuccess *ActionSuccess `protobuf:"bytes,1,opt,name=action_success,json=actionSuccess,proto3,oneof"` +func (x *BlogPostInput) GetCommentThreads() *ListOfListOfString { + if x != nil { + return x.CommentThreads + } + return nil } -type ActionResult_ActionError struct { - ActionError *ActionError `protobuf:"bytes,2,opt,name=action_error,json=actionError,proto3,oneof"` +func (x *BlogPostInput) GetSuggestions() *ListOfListOfString { + if x != nil { + return x.Suggestions + } + return nil } -func (*ActionResult_ActionSuccess) isActionResult_Value() {} - -func (*ActionResult_ActionError) isActionResult_Value() {} - -type NullableFieldsInput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - OptionalString *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"` - OptionalInt *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=optional_int,json=optionalInt,proto3" json:"optional_int,omitempty"` - OptionalFloat *wrapperspb.DoubleValue `protobuf:"bytes,4,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"` - OptionalBoolean *wrapperspb.BoolValue `protobuf:"bytes,5,opt,name=optional_boolean,json=optionalBoolean,proto3" json:"optional_boolean,omitempty"` - RequiredString string `protobuf:"bytes,6,opt,name=required_string,json=requiredString,proto3" json:"required_string,omitempty"` - RequiredInt int32 `protobuf:"varint,7,opt,name=required_int,json=requiredInt,proto3" json:"required_int,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type AuthorInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Email *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + Skills []string `protobuf:"bytes,3,rep,name=skills,proto3" json:"skills,omitempty"` + Languages []string `protobuf:"bytes,4,rep,name=languages,proto3" json:"languages,omitempty"` + SocialLinks *ListOfString `protobuf:"bytes,5,opt,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` + TeamsByProject *ListOfListOfString `protobuf:"bytes,6,opt,name=teams_by_project,json=teamsByProject,proto3" json:"teams_by_project,omitempty"` + Collaborations *ListOfListOfString `protobuf:"bytes,7,opt,name=collaborations,proto3" json:"collaborations,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *NullableFieldsInput) Reset() { - *x = NullableFieldsInput{} - mi := &file_product_proto_msgTypes[77] +func (x *AuthorInput) Reset() { + *x = AuthorInput{} + mi := &file_product_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *NullableFieldsInput) String() string { +func (x *AuthorInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NullableFieldsInput) ProtoMessage() {} +func (*AuthorInput) ProtoMessage() {} -func (x *NullableFieldsInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[77] +func (x *AuthorInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3929,58 +5728,58 @@ func (x *NullableFieldsInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NullableFieldsInput.ProtoReflect.Descriptor instead. -func (*NullableFieldsInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{77} +// Deprecated: Use AuthorInput.ProtoReflect.Descriptor instead. +func (*AuthorInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{110} } -func (x *NullableFieldsInput) GetName() string { +func (x *AuthorInput) GetName() string { if x != nil { return x.Name } return "" } -func (x *NullableFieldsInput) GetOptionalString() *wrapperspb.StringValue { +func (x *AuthorInput) GetEmail() *wrapperspb.StringValue { if x != nil { - return x.OptionalString + return x.Email } return nil } -func (x *NullableFieldsInput) GetOptionalInt() *wrapperspb.Int32Value { +func (x *AuthorInput) GetSkills() []string { if x != nil { - return x.OptionalInt + return x.Skills } return nil } -func (x *NullableFieldsInput) GetOptionalFloat() *wrapperspb.DoubleValue { +func (x *AuthorInput) GetLanguages() []string { if x != nil { - return x.OptionalFloat + return x.Languages } return nil } -func (x *NullableFieldsInput) GetOptionalBoolean() *wrapperspb.BoolValue { +func (x *AuthorInput) GetSocialLinks() *ListOfString { if x != nil { - return x.OptionalBoolean + return x.SocialLinks } return nil } -func (x *NullableFieldsInput) GetRequiredString() string { +func (x *AuthorInput) GetTeamsByProject() *ListOfListOfString { if x != nil { - return x.RequiredString + return x.TeamsByProject } - return "" + return nil } -func (x *NullableFieldsInput) GetRequiredInt() int32 { +func (x *AuthorInput) GetCollaborations() *ListOfListOfString { if x != nil { - return x.RequiredInt + return x.Collaborations } - return 0 + return nil } type NestedTypeB struct { @@ -3994,7 +5793,7 @@ type NestedTypeB struct { func (x *NestedTypeB) Reset() { *x = NestedTypeB{} - mi := &file_product_proto_msgTypes[78] + mi := &file_product_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4006,7 +5805,7 @@ func (x *NestedTypeB) String() string { func (*NestedTypeB) ProtoMessage() {} func (x *NestedTypeB) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[78] + mi := &file_product_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4019,7 +5818,7 @@ func (x *NestedTypeB) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeB.ProtoReflect.Descriptor instead. func (*NestedTypeB) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{78} + return file_product_proto_rawDescGZIP(), []int{111} } func (x *NestedTypeB) GetId() string { @@ -4053,7 +5852,7 @@ type NestedTypeC struct { func (x *NestedTypeC) Reset() { *x = NestedTypeC{} - mi := &file_product_proto_msgTypes[79] + mi := &file_product_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4065,7 +5864,7 @@ func (x *NestedTypeC) String() string { func (*NestedTypeC) ProtoMessage() {} func (x *NestedTypeC) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[79] + mi := &file_product_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4078,7 +5877,7 @@ func (x *NestedTypeC) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeC.ProtoReflect.Descriptor instead. func (*NestedTypeC) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{79} + return file_product_proto_rawDescGZIP(), []int{112} } func (x *NestedTypeC) GetId() string { @@ -4107,7 +5906,7 @@ type FilterType struct { func (x *FilterType) Reset() { *x = FilterType{} - mi := &file_product_proto_msgTypes[80] + mi := &file_product_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4119,7 +5918,7 @@ func (x *FilterType) String() string { func (*FilterType) ProtoMessage() {} func (x *FilterType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[80] + mi := &file_product_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4132,7 +5931,7 @@ func (x *FilterType) ProtoReflect() protoreflect.Message { // Deprecated: Use FilterType.ProtoReflect.Descriptor instead. func (*FilterType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{80} + return file_product_proto_rawDescGZIP(), []int{113} } func (x *FilterType) GetName() string { @@ -4173,7 +5972,7 @@ type Pagination struct { func (x *Pagination) Reset() { *x = Pagination{} - mi := &file_product_proto_msgTypes[81] + mi := &file_product_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4185,7 +5984,7 @@ func (x *Pagination) String() string { func (*Pagination) ProtoMessage() {} func (x *Pagination) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[81] + mi := &file_product_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4198,7 +5997,7 @@ func (x *Pagination) ProtoReflect() protoreflect.Message { // Deprecated: Use Pagination.ProtoReflect.Descriptor instead. func (*Pagination) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{81} + return file_product_proto_rawDescGZIP(), []int{114} } func (x *Pagination) GetPage() int32 { @@ -4226,7 +6025,7 @@ type OrderLineInput struct { func (x *OrderLineInput) Reset() { *x = OrderLineInput{} - mi := &file_product_proto_msgTypes[82] + mi := &file_product_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4238,7 +6037,7 @@ func (x *OrderLineInput) String() string { func (*OrderLineInput) ProtoMessage() {} func (x *OrderLineInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[82] + mi := &file_product_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4251,7 +6050,7 @@ func (x *OrderLineInput) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderLineInput.ProtoReflect.Descriptor instead. func (*OrderLineInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{82} + return file_product_proto_rawDescGZIP(), []int{115} } func (x *OrderLineInput) GetProductId() string { @@ -4286,7 +6085,7 @@ type OrderLine struct { func (x *OrderLine) Reset() { *x = OrderLine{} - mi := &file_product_proto_msgTypes[83] + mi := &file_product_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4298,7 +6097,7 @@ func (x *OrderLine) String() string { func (*OrderLine) ProtoMessage() {} func (x *OrderLine) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[83] + mi := &file_product_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4311,7 +6110,7 @@ func (x *OrderLine) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderLine.ProtoReflect.Descriptor instead. func (*OrderLine) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{83} + return file_product_proto_rawDescGZIP(), []int{116} } func (x *OrderLine) GetProductId() string { @@ -4347,7 +6146,7 @@ type Cat struct { func (x *Cat) Reset() { *x = Cat{} - mi := &file_product_proto_msgTypes[84] + mi := &file_product_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4359,7 +6158,7 @@ func (x *Cat) String() string { func (*Cat) ProtoMessage() {} func (x *Cat) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[84] + mi := &file_product_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4372,7 +6171,7 @@ func (x *Cat) ProtoReflect() protoreflect.Message { // Deprecated: Use Cat.ProtoReflect.Descriptor instead. func (*Cat) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{84} + return file_product_proto_rawDescGZIP(), []int{117} } func (x *Cat) GetId() string { @@ -4415,7 +6214,7 @@ type Dog struct { func (x *Dog) Reset() { *x = Dog{} - mi := &file_product_proto_msgTypes[85] + mi := &file_product_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4427,7 +6226,7 @@ func (x *Dog) String() string { func (*Dog) ProtoMessage() {} func (x *Dog) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[85] + mi := &file_product_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4440,7 +6239,7 @@ func (x *Dog) ProtoReflect() protoreflect.Message { // Deprecated: Use Dog.ProtoReflect.Descriptor instead. func (*Dog) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{85} + return file_product_proto_rawDescGZIP(), []int{118} } func (x *Dog) GetId() string { @@ -4481,7 +6280,7 @@ type ActionSuccess struct { func (x *ActionSuccess) Reset() { *x = ActionSuccess{} - mi := &file_product_proto_msgTypes[86] + mi := &file_product_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4493,7 +6292,7 @@ func (x *ActionSuccess) String() string { func (*ActionSuccess) ProtoMessage() {} func (x *ActionSuccess) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[86] + mi := &file_product_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4506,7 +6305,7 @@ func (x *ActionSuccess) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionSuccess.ProtoReflect.Descriptor instead. func (*ActionSuccess) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{86} + return file_product_proto_rawDescGZIP(), []int{119} } func (x *ActionSuccess) GetMessage() string { @@ -4533,7 +6332,7 @@ type ActionError struct { func (x *ActionError) Reset() { *x = ActionError{} - mi := &file_product_proto_msgTypes[87] + mi := &file_product_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4545,7 +6344,7 @@ func (x *ActionError) String() string { func (*ActionError) ProtoMessage() {} func (x *ActionError) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[87] + mi := &file_product_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4558,7 +6357,7 @@ func (x *ActionError) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionError.ProtoReflect.Descriptor instead. func (*ActionError) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{87} + return file_product_proto_rawDescGZIP(), []int{120} } func (x *ActionError) GetMessage() string { @@ -4575,11 +6374,115 @@ func (x *ActionError) GetCode() string { return "" } +type CategoryInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Kind CategoryKind `protobuf:"varint,2,opt,name=kind,proto3,enum=productv1.CategoryKind" json:"kind,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CategoryInput) Reset() { + *x = CategoryInput{} + mi := &file_product_proto_msgTypes[121] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CategoryInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CategoryInput) ProtoMessage() {} + +func (x *CategoryInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[121] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CategoryInput.ProtoReflect.Descriptor instead. +func (*CategoryInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{121} +} + +func (x *CategoryInput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CategoryInput) GetKind() CategoryKind { + if x != nil { + return x.Kind + } + return CategoryKind_CATEGORY_KIND_UNSPECIFIED +} + +type ListOfListOfString_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*ListOfString `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfString_List) Reset() { + *x = ListOfListOfString_List{} + mi := &file_product_proto_msgTypes[122] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfString_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfString_List) ProtoMessage() {} + +func (x *ListOfListOfString_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[122] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfString_List.ProtoReflect.Descriptor instead. +func (*ListOfListOfString_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *ListOfListOfString_List) GetItems() []*ListOfString { + if x != nil { + return x.Items + } + return nil +} + var File_product_proto protoreflect.FileDescriptor const file_product_proto_rawDesc = "" + "\n" + - "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\"=\n" + + "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\"%\n" + + "\rListOfBoolean\x12\x14\n" + + "\x05items\x18\x01 \x03(\bR\x05items\"#\n" + + "\vListOfFloat\x12\x14\n" + + "\x05items\x18\x01 \x03(\x01R\x05items\"\x83\x01\n" + + "\x12ListOfListOfString\x126\n" + + "\x04list\x18\x01 \x01(\v2\".productv1.ListOfListOfString.ListR\x04list\x1a5\n" + + "\x04List\x12-\n" + + "\x05items\x18\x01 \x03(\v2\x17.productv1.ListOfStringR\x05items\"=\n" + "\x0fListOfOrderLine\x12*\n" + "\x05items\x18\x01 \x03(\v2\x14.productv1.OrderLineR\x05items\"$\n" + "\fListOfString\x12\x14\n" + @@ -4671,7 +6574,37 @@ const file_product_proto_rawDesc = "" + " nullable_fields_type_with_filter\x18\x01 \x03(\v2\x1d.productv1.NullableFieldsTypeR\x1cnullableFieldsTypeWithFilter\"$\n" + "\"QueryAllNullableFieldsTypesRequest\"\x7f\n" + "#QueryAllNullableFieldsTypesResponse\x12X\n" + - "\x19all_nullable_fields_types\x18\x01 \x03(\v2\x1d.productv1.NullableFieldsTypeR\x16allNullableFieldsTypes\"G\n" + + "\x19all_nullable_fields_types\x18\x01 \x03(\v2\x1d.productv1.NullableFieldsTypeR\x16allNullableFieldsTypes\"\x16\n" + + "\x14QueryBlogPostRequest\"I\n" + + "\x15QueryBlogPostResponse\x120\n" + + "\tblog_post\x18\x01 \x01(\v2\x13.productv1.BlogPostR\bblogPost\"*\n" + + "\x18QueryBlogPostByIdRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"W\n" + + "\x19QueryBlogPostByIdResponse\x12:\n" + + "\x0fblog_post_by_id\x18\x01 \x01(\v2\x13.productv1.BlogPostR\fblogPostById\"T\n" + + "\x1fQueryBlogPostsWithFilterRequest\x121\n" + + "\x06filter\x18\x01 \x01(\v2\x19.productv1.BlogPostFilterR\x06filter\"l\n" + + " QueryBlogPostsWithFilterResponse\x12H\n" + + "\x16blog_posts_with_filter\x18\x01 \x03(\v2\x13.productv1.BlogPostR\x13blogPostsWithFilter\"\x1a\n" + + "\x18QueryAllBlogPostsRequest\"V\n" + + "\x19QueryAllBlogPostsResponse\x129\n" + + "\x0eall_blog_posts\x18\x01 \x03(\v2\x13.productv1.BlogPostR\fallBlogPosts\"\x14\n" + + "\x12QueryAuthorRequest\"@\n" + + "\x13QueryAuthorResponse\x12)\n" + + "\x06author\x18\x01 \x01(\v2\x11.productv1.AuthorR\x06author\"(\n" + + "\x16QueryAuthorByIdRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"N\n" + + "\x17QueryAuthorByIdResponse\x123\n" + + "\fauthor_by_id\x18\x01 \x01(\v2\x11.productv1.AuthorR\n" + + "authorById\"P\n" + + "\x1dQueryAuthorsWithFilterRequest\x12/\n" + + "\x06filter\x18\x01 \x01(\v2\x17.productv1.AuthorFilterR\x06filter\"c\n" + + "\x1eQueryAuthorsWithFilterResponse\x12A\n" + + "\x13authors_with_filter\x18\x01 \x03(\v2\x11.productv1.AuthorR\x11authorsWithFilter\"\x18\n" + + "\x16QueryAllAuthorsRequest\"M\n" + + "\x17QueryAllAuthorsResponse\x122\n" + + "\vall_authors\x18\x01 \x03(\v2\x11.productv1.AuthorR\n" + + "allAuthors\"G\n" + "\x19MutationCreateUserRequest\x12*\n" + "\x05input\x18\x01 \x01(\v2\x14.productv1.UserInputR\x05input\"N\n" + "\x1aMutationCreateUserResponse\x120\n" + @@ -4689,7 +6622,25 @@ const file_product_proto_rawDesc = "" + "\x02id\x18\x01 \x01(\tR\x02id\x124\n" + "\x05input\x18\x02 \x01(\v2\x1e.productv1.NullableFieldsInputR\x05input\"\x88\x01\n" + "(MutationUpdateNullableFieldsTypeResponse\x12\\\n" + - "\x1bupdate_nullable_fields_type\x18\x01 \x01(\v2\x1d.productv1.NullableFieldsTypeR\x18updateNullableFieldsType\"C\n" + + "\x1bupdate_nullable_fields_type\x18\x01 \x01(\v2\x1d.productv1.NullableFieldsTypeR\x18updateNullableFieldsType\"O\n" + + "\x1dMutationCreateBlogPostRequest\x12.\n" + + "\x05input\x18\x01 \x01(\v2\x18.productv1.BlogPostInputR\x05input\"_\n" + + "\x1eMutationCreateBlogPostResponse\x12=\n" + + "\x10create_blog_post\x18\x01 \x01(\v2\x13.productv1.BlogPostR\x0ecreateBlogPost\"_\n" + + "\x1dMutationUpdateBlogPostRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" + + "\x05input\x18\x02 \x01(\v2\x18.productv1.BlogPostInputR\x05input\"_\n" + + "\x1eMutationUpdateBlogPostResponse\x12=\n" + + "\x10update_blog_post\x18\x01 \x01(\v2\x13.productv1.BlogPostR\x0eupdateBlogPost\"K\n" + + "\x1bMutationCreateAuthorRequest\x12,\n" + + "\x05input\x18\x01 \x01(\v2\x16.productv1.AuthorInputR\x05input\"V\n" + + "\x1cMutationCreateAuthorResponse\x126\n" + + "\rcreate_author\x18\x01 \x01(\v2\x11.productv1.AuthorR\fcreateAuthor\"[\n" + + "\x1bMutationUpdateAuthorRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12,\n" + + "\x05input\x18\x02 \x01(\v2\x16.productv1.AuthorInputR\x05input\"V\n" + + "\x1cMutationUpdateAuthorResponse\x126\n" + + "\rupdate_author\x18\x01 \x01(\v2\x11.productv1.AuthorR\fupdateAuthor\"C\n" + "\aProduct\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12\x14\n" + @@ -4768,7 +6719,45 @@ const file_product_proto_rawDesc = "" + "\x14NullableFieldsFilter\x120\n" + "\x04name\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12E\n" + "\x0foptional_string\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12?\n" + - "\rinclude_nulls\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\fincludeNulls\"\x1f\n" + + "\rinclude_nulls\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\fincludeNulls\"\x8e\x05\n" + + "\bBlogPost\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + + "\x05title\x18\x02 \x01(\tR\x05title\x12\x18\n" + + "\acontent\x18\x03 \x01(\tR\acontent\x12\x12\n" + + "\x04tags\x18\x04 \x03(\tR\x04tags\x12<\n" + + "\roptional_tags\x18\x05 \x01(\v2\x17.productv1.ListOfStringR\foptionalTags\x12\x1e\n" + + "\n" + + "categories\x18\x06 \x03(\tR\n" + + "categories\x123\n" + + "\bkeywords\x18\a \x01(\v2\x17.productv1.ListOfStringR\bkeywords\x12\x1f\n" + + "\vview_counts\x18\b \x03(\x05R\n" + + "viewCounts\x120\n" + + "\aratings\x18\t \x01(\v2\x16.productv1.ListOfFloatR\aratings\x12;\n" + + "\fis_published\x18\n" + + " \x01(\v2\x18.productv1.ListOfBooleanR\visPublished\x12<\n" + + "\n" + + "tag_groups\x18\v \x01(\v2\x1d.productv1.ListOfListOfStringR\ttagGroups\x12D\n" + + "\x0erelated_topics\x18\f \x01(\v2\x1d.productv1.ListOfListOfStringR\rrelatedTopics\x12F\n" + + "\x0fcomment_threads\x18\r \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecommentThreads\x12?\n" + + "\vsuggestions\x18\x0e \x01(\v2\x1d.productv1.ListOfListOfStringR\vsuggestions\"\xbf\x01\n" + + "\x0eBlogPostFilter\x122\n" + + "\x05title\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x05title\x12A\n" + + "\x0ehas_categories\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\rhasCategories\x126\n" + + "\bmin_tags\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\aminTags\"\xe2\x02\n" + + "\x06Author\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x122\n" + + "\x05email\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05email\x12\x16\n" + + "\x06skills\x18\x04 \x03(\tR\x06skills\x12\x1c\n" + + "\tlanguages\x18\x05 \x03(\tR\tlanguages\x12:\n" + + "\fsocial_links\x18\x06 \x01(\v2\x17.productv1.ListOfStringR\vsocialLinks\x12G\n" + + "\x10teams_by_project\x18\a \x01(\v2\x1d.productv1.ListOfListOfStringR\x0eteamsByProject\x12E\n" + + "\x0ecollaborations\x18\b \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecollaborations\"\xb7\x01\n" + + "\fAuthorFilter\x120\n" + + "\x04name\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x127\n" + + "\thas_teams\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\bhasTeams\x12<\n" + + "\vskill_count\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\n" + + "skillCount\"\x1f\n" + "\tUserInput\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\";\n" + "\vActionInput\x12\x12\n" + @@ -4785,7 +6774,34 @@ const file_product_proto_rawDesc = "" + "\x0eoptional_float\x18\x04 \x01(\v2\x1c.google.protobuf.DoubleValueR\roptionalFloat\x12E\n" + "\x10optional_boolean\x18\x05 \x01(\v2\x1a.google.protobuf.BoolValueR\x0foptionalBoolean\x12'\n" + "\x0frequired_string\x18\x06 \x01(\tR\x0erequiredString\x12!\n" + - "\frequired_int\x18\a \x01(\x05R\vrequiredInt\"W\n" + + "\frequired_int\x18\a \x01(\x05R\vrequiredInt\"\x83\x05\n" + + "\rBlogPostInput\x12\x14\n" + + "\x05title\x18\x01 \x01(\tR\x05title\x12\x18\n" + + "\acontent\x18\x02 \x01(\tR\acontent\x12\x12\n" + + "\x04tags\x18\x03 \x03(\tR\x04tags\x12<\n" + + "\roptional_tags\x18\x04 \x01(\v2\x17.productv1.ListOfStringR\foptionalTags\x12\x1e\n" + + "\n" + + "categories\x18\x05 \x03(\tR\n" + + "categories\x123\n" + + "\bkeywords\x18\x06 \x01(\v2\x17.productv1.ListOfStringR\bkeywords\x12\x1f\n" + + "\vview_counts\x18\a \x03(\x05R\n" + + "viewCounts\x120\n" + + "\aratings\x18\b \x01(\v2\x16.productv1.ListOfFloatR\aratings\x12;\n" + + "\fis_published\x18\t \x01(\v2\x18.productv1.ListOfBooleanR\visPublished\x12<\n" + + "\n" + + "tag_groups\x18\n" + + " \x01(\v2\x1d.productv1.ListOfListOfStringR\ttagGroups\x12D\n" + + "\x0erelated_topics\x18\v \x01(\v2\x1d.productv1.ListOfListOfStringR\rrelatedTopics\x12F\n" + + "\x0fcomment_threads\x18\f \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecommentThreads\x12?\n" + + "\vsuggestions\x18\r \x01(\v2\x1d.productv1.ListOfListOfStringR\vsuggestions\"\xd7\x02\n" + + "\vAuthorInput\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x122\n" + + "\x05email\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x05email\x12\x16\n" + + "\x06skills\x18\x03 \x03(\tR\x06skills\x12\x1c\n" + + "\tlanguages\x18\x04 \x03(\tR\tlanguages\x12:\n" + + "\fsocial_links\x18\x05 \x01(\v2\x17.productv1.ListOfStringR\vsocialLinks\x12G\n" + + "\x10teams_by_project\x18\x06 \x01(\v2\x1d.productv1.ListOfListOfStringR\x0eteamsByProject\x12E\n" + + "\x0ecollaborations\x18\a \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecollaborations\"W\n" + "\vNestedTypeB\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12$\n" + @@ -4832,22 +6848,37 @@ const file_product_proto_rawDesc = "" + "\ttimestamp\x18\x02 \x01(\tR\ttimestamp\";\n" + "\vActionError\x12\x18\n" + "\amessage\x18\x01 \x01(\tR\amessage\x12\x12\n" + - "\x04code\x18\x02 \x01(\tR\x04code*\x9a\x01\n" + + "\x04code\x18\x02 \x01(\tR\x04code\"P\n" + + "\rCategoryInput\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12+\n" + + "\x04kind\x18\x02 \x01(\x0e2\x17.productv1.CategoryKindR\x04kind*\x9a\x01\n" + "\fCategoryKind\x12\x1d\n" + "\x19CATEGORY_KIND_UNSPECIFIED\x10\x00\x12\x16\n" + "\x12CATEGORY_KIND_BOOK\x10\x01\x12\x1d\n" + "\x19CATEGORY_KIND_ELECTRONICS\x10\x02\x12\x1b\n" + "\x17CATEGORY_KIND_FURNITURE\x10\x03\x12\x17\n" + - "\x13CATEGORY_KIND_OTHER\x10\x042\xb2\x16\n" + + "\x13CATEGORY_KIND_OTHER\x10\x042\xf4\x1f\n" + "\x0eProductService\x12`\n" + "\x11LookupProductById\x12#.productv1.LookupProductByIdRequest\x1a$.productv1.LookupProductByIdResponse\"\x00\x12`\n" + - "\x11LookupStorageById\x12#.productv1.LookupStorageByIdRequest\x1a$.productv1.LookupStorageByIdResponse\"\x00\x12\x8d\x01\n" + + "\x11LookupStorageById\x12#.productv1.LookupStorageByIdRequest\x1a$.productv1.LookupStorageByIdResponse\"\x00\x12i\n" + + "\x14MutationCreateAuthor\x12&.productv1.MutationCreateAuthorRequest\x1a'.productv1.MutationCreateAuthorResponse\"\x00\x12o\n" + + "\x16MutationCreateBlogPost\x12(.productv1.MutationCreateBlogPostRequest\x1a).productv1.MutationCreateBlogPostResponse\"\x00\x12\x8d\x01\n" + " MutationCreateNullableFieldsType\x122.productv1.MutationCreateNullableFieldsTypeRequest\x1a3.productv1.MutationCreateNullableFieldsTypeResponse\"\x00\x12c\n" + "\x12MutationCreateUser\x12$.productv1.MutationCreateUserRequest\x1a%.productv1.MutationCreateUserResponse\"\x00\x12l\n" + - "\x15MutationPerformAction\x12'.productv1.MutationPerformActionRequest\x1a(.productv1.MutationPerformActionResponse\"\x00\x12\x8d\x01\n" + - " MutationUpdateNullableFieldsType\x122.productv1.MutationUpdateNullableFieldsTypeRequest\x1a3.productv1.MutationUpdateNullableFieldsTypeResponse\"\x00\x12~\n" + + "\x15MutationPerformAction\x12'.productv1.MutationPerformActionRequest\x1a(.productv1.MutationPerformActionResponse\"\x00\x12i\n" + + "\x14MutationUpdateAuthor\x12&.productv1.MutationUpdateAuthorRequest\x1a'.productv1.MutationUpdateAuthorResponse\"\x00\x12o\n" + + "\x16MutationUpdateBlogPost\x12(.productv1.MutationUpdateBlogPostRequest\x1a).productv1.MutationUpdateBlogPostResponse\"\x00\x12\x8d\x01\n" + + " MutationUpdateNullableFieldsType\x122.productv1.MutationUpdateNullableFieldsTypeRequest\x1a3.productv1.MutationUpdateNullableFieldsTypeResponse\"\x00\x12Z\n" + + "\x0fQueryAllAuthors\x12!.productv1.QueryAllAuthorsRequest\x1a\".productv1.QueryAllAuthorsResponse\"\x00\x12`\n" + + "\x11QueryAllBlogPosts\x12#.productv1.QueryAllBlogPostsRequest\x1a$.productv1.QueryAllBlogPostsResponse\"\x00\x12~\n" + "\x1bQueryAllNullableFieldsTypes\x12-.productv1.QueryAllNullableFieldsTypesRequest\x1a..productv1.QueryAllNullableFieldsTypesResponse\"\x00\x12Q\n" + - "\fQueryAllPets\x12\x1e.productv1.QueryAllPetsRequest\x1a\x1f.productv1.QueryAllPetsResponse\"\x00\x12i\n" + + "\fQueryAllPets\x12\x1e.productv1.QueryAllPetsRequest\x1a\x1f.productv1.QueryAllPetsResponse\"\x00\x12N\n" + + "\vQueryAuthor\x12\x1d.productv1.QueryAuthorRequest\x1a\x1e.productv1.QueryAuthorResponse\"\x00\x12Z\n" + + "\x0fQueryAuthorById\x12!.productv1.QueryAuthorByIdRequest\x1a\".productv1.QueryAuthorByIdResponse\"\x00\x12o\n" + + "\x16QueryAuthorsWithFilter\x12(.productv1.QueryAuthorsWithFilterRequest\x1a).productv1.QueryAuthorsWithFilterResponse\"\x00\x12T\n" + + "\rQueryBlogPost\x12\x1f.productv1.QueryBlogPostRequest\x1a .productv1.QueryBlogPostResponse\"\x00\x12`\n" + + "\x11QueryBlogPostById\x12#.productv1.QueryBlogPostByIdRequest\x1a$.productv1.QueryBlogPostByIdResponse\"\x00\x12u\n" + + "\x18QueryBlogPostsWithFilter\x12*.productv1.QueryBlogPostsWithFilterRequest\x1a+.productv1.QueryBlogPostsWithFilterResponse\"\x00\x12i\n" + "\x14QueryCalculateTotals\x12&.productv1.QueryCalculateTotalsRequest\x1a'.productv1.QueryCalculateTotalsResponse\"\x00\x12Z\n" + "\x0fQueryCategories\x12!.productv1.QueryCategoriesRequest\x1a\".productv1.QueryCategoriesResponse\"\x00\x12l\n" + "\x15QueryCategoriesByKind\x12'.productv1.QueryCategoriesByKindRequest\x1a(.productv1.QueryCategoriesByKindResponse\"\x00\x12o\n" + @@ -4881,232 +6912,342 @@ func file_product_proto_rawDescGZIP() []byte { } var file_product_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 88) +var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 123) var file_product_proto_goTypes = []any{ (CategoryKind)(0), // 0: productv1.CategoryKind - (*ListOfOrderLine)(nil), // 1: productv1.ListOfOrderLine - (*ListOfString)(nil), // 2: productv1.ListOfString - (*LookupProductByIdRequestKey)(nil), // 3: productv1.LookupProductByIdRequestKey - (*LookupProductByIdRequest)(nil), // 4: productv1.LookupProductByIdRequest - (*LookupProductByIdResponse)(nil), // 5: productv1.LookupProductByIdResponse - (*LookupStorageByIdRequestKey)(nil), // 6: productv1.LookupStorageByIdRequestKey - (*LookupStorageByIdRequest)(nil), // 7: productv1.LookupStorageByIdRequest - (*LookupStorageByIdResponse)(nil), // 8: productv1.LookupStorageByIdResponse - (*QueryUsersRequest)(nil), // 9: productv1.QueryUsersRequest - (*QueryUsersResponse)(nil), // 10: productv1.QueryUsersResponse - (*QueryUserRequest)(nil), // 11: productv1.QueryUserRequest - (*QueryUserResponse)(nil), // 12: productv1.QueryUserResponse - (*QueryNestedTypeRequest)(nil), // 13: productv1.QueryNestedTypeRequest - (*QueryNestedTypeResponse)(nil), // 14: productv1.QueryNestedTypeResponse - (*QueryRecursiveTypeRequest)(nil), // 15: productv1.QueryRecursiveTypeRequest - (*QueryRecursiveTypeResponse)(nil), // 16: productv1.QueryRecursiveTypeResponse - (*QueryTypeFilterWithArgumentsRequest)(nil), // 17: productv1.QueryTypeFilterWithArgumentsRequest - (*QueryTypeFilterWithArgumentsResponse)(nil), // 18: productv1.QueryTypeFilterWithArgumentsResponse - (*QueryTypeWithMultipleFilterFieldsRequest)(nil), // 19: productv1.QueryTypeWithMultipleFilterFieldsRequest - (*QueryTypeWithMultipleFilterFieldsResponse)(nil), // 20: productv1.QueryTypeWithMultipleFilterFieldsResponse - (*QueryComplexFilterTypeRequest)(nil), // 21: productv1.QueryComplexFilterTypeRequest - (*QueryComplexFilterTypeResponse)(nil), // 22: productv1.QueryComplexFilterTypeResponse - (*QueryCalculateTotalsRequest)(nil), // 23: productv1.QueryCalculateTotalsRequest - (*QueryCalculateTotalsResponse)(nil), // 24: productv1.QueryCalculateTotalsResponse - (*QueryCategoriesRequest)(nil), // 25: productv1.QueryCategoriesRequest - (*QueryCategoriesResponse)(nil), // 26: productv1.QueryCategoriesResponse - (*QueryCategoriesByKindRequest)(nil), // 27: productv1.QueryCategoriesByKindRequest - (*QueryCategoriesByKindResponse)(nil), // 28: productv1.QueryCategoriesByKindResponse - (*QueryCategoriesByKindsRequest)(nil), // 29: productv1.QueryCategoriesByKindsRequest - (*QueryCategoriesByKindsResponse)(nil), // 30: productv1.QueryCategoriesByKindsResponse - (*QueryFilterCategoriesRequest)(nil), // 31: productv1.QueryFilterCategoriesRequest - (*QueryFilterCategoriesResponse)(nil), // 32: productv1.QueryFilterCategoriesResponse - (*QueryRandomPetRequest)(nil), // 33: productv1.QueryRandomPetRequest - (*QueryRandomPetResponse)(nil), // 34: productv1.QueryRandomPetResponse - (*QueryAllPetsRequest)(nil), // 35: productv1.QueryAllPetsRequest - (*QueryAllPetsResponse)(nil), // 36: productv1.QueryAllPetsResponse - (*QuerySearchRequest)(nil), // 37: productv1.QuerySearchRequest - (*QuerySearchResponse)(nil), // 38: productv1.QuerySearchResponse - (*QueryRandomSearchResultRequest)(nil), // 39: productv1.QueryRandomSearchResultRequest - (*QueryRandomSearchResultResponse)(nil), // 40: productv1.QueryRandomSearchResultResponse - (*QueryNullableFieldsTypeRequest)(nil), // 41: productv1.QueryNullableFieldsTypeRequest - (*QueryNullableFieldsTypeResponse)(nil), // 42: productv1.QueryNullableFieldsTypeResponse - (*QueryNullableFieldsTypeByIdRequest)(nil), // 43: productv1.QueryNullableFieldsTypeByIdRequest - (*QueryNullableFieldsTypeByIdResponse)(nil), // 44: productv1.QueryNullableFieldsTypeByIdResponse - (*QueryNullableFieldsTypeWithFilterRequest)(nil), // 45: productv1.QueryNullableFieldsTypeWithFilterRequest - (*QueryNullableFieldsTypeWithFilterResponse)(nil), // 46: productv1.QueryNullableFieldsTypeWithFilterResponse - (*QueryAllNullableFieldsTypesRequest)(nil), // 47: productv1.QueryAllNullableFieldsTypesRequest - (*QueryAllNullableFieldsTypesResponse)(nil), // 48: productv1.QueryAllNullableFieldsTypesResponse - (*MutationCreateUserRequest)(nil), // 49: productv1.MutationCreateUserRequest - (*MutationCreateUserResponse)(nil), // 50: productv1.MutationCreateUserResponse - (*MutationPerformActionRequest)(nil), // 51: productv1.MutationPerformActionRequest - (*MutationPerformActionResponse)(nil), // 52: productv1.MutationPerformActionResponse - (*MutationCreateNullableFieldsTypeRequest)(nil), // 53: productv1.MutationCreateNullableFieldsTypeRequest - (*MutationCreateNullableFieldsTypeResponse)(nil), // 54: productv1.MutationCreateNullableFieldsTypeResponse - (*MutationUpdateNullableFieldsTypeRequest)(nil), // 55: productv1.MutationUpdateNullableFieldsTypeRequest - (*MutationUpdateNullableFieldsTypeResponse)(nil), // 56: productv1.MutationUpdateNullableFieldsTypeResponse - (*Product)(nil), // 57: productv1.Product - (*Storage)(nil), // 58: productv1.Storage - (*User)(nil), // 59: productv1.User - (*NestedTypeA)(nil), // 60: productv1.NestedTypeA - (*RecursiveType)(nil), // 61: productv1.RecursiveType - (*TypeWithMultipleFilterFields)(nil), // 62: productv1.TypeWithMultipleFilterFields - (*FilterTypeInput)(nil), // 63: productv1.FilterTypeInput - (*ComplexFilterTypeInput)(nil), // 64: productv1.ComplexFilterTypeInput - (*TypeWithComplexFilterInput)(nil), // 65: productv1.TypeWithComplexFilterInput - (*OrderInput)(nil), // 66: productv1.OrderInput - (*Order)(nil), // 67: productv1.Order - (*Category)(nil), // 68: productv1.Category - (*CategoryFilter)(nil), // 69: productv1.CategoryFilter - (*Animal)(nil), // 70: productv1.Animal - (*SearchInput)(nil), // 71: productv1.SearchInput - (*SearchResult)(nil), // 72: productv1.SearchResult - (*NullableFieldsType)(nil), // 73: productv1.NullableFieldsType - (*NullableFieldsFilter)(nil), // 74: productv1.NullableFieldsFilter - (*UserInput)(nil), // 75: productv1.UserInput - (*ActionInput)(nil), // 76: productv1.ActionInput - (*ActionResult)(nil), // 77: productv1.ActionResult - (*NullableFieldsInput)(nil), // 78: productv1.NullableFieldsInput - (*NestedTypeB)(nil), // 79: productv1.NestedTypeB - (*NestedTypeC)(nil), // 80: productv1.NestedTypeC - (*FilterType)(nil), // 81: productv1.FilterType - (*Pagination)(nil), // 82: productv1.Pagination - (*OrderLineInput)(nil), // 83: productv1.OrderLineInput - (*OrderLine)(nil), // 84: productv1.OrderLine - (*Cat)(nil), // 85: productv1.Cat - (*Dog)(nil), // 86: productv1.Dog - (*ActionSuccess)(nil), // 87: productv1.ActionSuccess - (*ActionError)(nil), // 88: productv1.ActionError - (*wrapperspb.Int32Value)(nil), // 89: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 90: google.protobuf.StringValue - (*wrapperspb.DoubleValue)(nil), // 91: google.protobuf.DoubleValue - (*wrapperspb.BoolValue)(nil), // 92: google.protobuf.BoolValue + (*ListOfBoolean)(nil), // 1: productv1.ListOfBoolean + (*ListOfFloat)(nil), // 2: productv1.ListOfFloat + (*ListOfListOfString)(nil), // 3: productv1.ListOfListOfString + (*ListOfOrderLine)(nil), // 4: productv1.ListOfOrderLine + (*ListOfString)(nil), // 5: productv1.ListOfString + (*LookupProductByIdRequestKey)(nil), // 6: productv1.LookupProductByIdRequestKey + (*LookupProductByIdRequest)(nil), // 7: productv1.LookupProductByIdRequest + (*LookupProductByIdResponse)(nil), // 8: productv1.LookupProductByIdResponse + (*LookupStorageByIdRequestKey)(nil), // 9: productv1.LookupStorageByIdRequestKey + (*LookupStorageByIdRequest)(nil), // 10: productv1.LookupStorageByIdRequest + (*LookupStorageByIdResponse)(nil), // 11: productv1.LookupStorageByIdResponse + (*QueryUsersRequest)(nil), // 12: productv1.QueryUsersRequest + (*QueryUsersResponse)(nil), // 13: productv1.QueryUsersResponse + (*QueryUserRequest)(nil), // 14: productv1.QueryUserRequest + (*QueryUserResponse)(nil), // 15: productv1.QueryUserResponse + (*QueryNestedTypeRequest)(nil), // 16: productv1.QueryNestedTypeRequest + (*QueryNestedTypeResponse)(nil), // 17: productv1.QueryNestedTypeResponse + (*QueryRecursiveTypeRequest)(nil), // 18: productv1.QueryRecursiveTypeRequest + (*QueryRecursiveTypeResponse)(nil), // 19: productv1.QueryRecursiveTypeResponse + (*QueryTypeFilterWithArgumentsRequest)(nil), // 20: productv1.QueryTypeFilterWithArgumentsRequest + (*QueryTypeFilterWithArgumentsResponse)(nil), // 21: productv1.QueryTypeFilterWithArgumentsResponse + (*QueryTypeWithMultipleFilterFieldsRequest)(nil), // 22: productv1.QueryTypeWithMultipleFilterFieldsRequest + (*QueryTypeWithMultipleFilterFieldsResponse)(nil), // 23: productv1.QueryTypeWithMultipleFilterFieldsResponse + (*QueryComplexFilterTypeRequest)(nil), // 24: productv1.QueryComplexFilterTypeRequest + (*QueryComplexFilterTypeResponse)(nil), // 25: productv1.QueryComplexFilterTypeResponse + (*QueryCalculateTotalsRequest)(nil), // 26: productv1.QueryCalculateTotalsRequest + (*QueryCalculateTotalsResponse)(nil), // 27: productv1.QueryCalculateTotalsResponse + (*QueryCategoriesRequest)(nil), // 28: productv1.QueryCategoriesRequest + (*QueryCategoriesResponse)(nil), // 29: productv1.QueryCategoriesResponse + (*QueryCategoriesByKindRequest)(nil), // 30: productv1.QueryCategoriesByKindRequest + (*QueryCategoriesByKindResponse)(nil), // 31: productv1.QueryCategoriesByKindResponse + (*QueryCategoriesByKindsRequest)(nil), // 32: productv1.QueryCategoriesByKindsRequest + (*QueryCategoriesByKindsResponse)(nil), // 33: productv1.QueryCategoriesByKindsResponse + (*QueryFilterCategoriesRequest)(nil), // 34: productv1.QueryFilterCategoriesRequest + (*QueryFilterCategoriesResponse)(nil), // 35: productv1.QueryFilterCategoriesResponse + (*QueryRandomPetRequest)(nil), // 36: productv1.QueryRandomPetRequest + (*QueryRandomPetResponse)(nil), // 37: productv1.QueryRandomPetResponse + (*QueryAllPetsRequest)(nil), // 38: productv1.QueryAllPetsRequest + (*QueryAllPetsResponse)(nil), // 39: productv1.QueryAllPetsResponse + (*QuerySearchRequest)(nil), // 40: productv1.QuerySearchRequest + (*QuerySearchResponse)(nil), // 41: productv1.QuerySearchResponse + (*QueryRandomSearchResultRequest)(nil), // 42: productv1.QueryRandomSearchResultRequest + (*QueryRandomSearchResultResponse)(nil), // 43: productv1.QueryRandomSearchResultResponse + (*QueryNullableFieldsTypeRequest)(nil), // 44: productv1.QueryNullableFieldsTypeRequest + (*QueryNullableFieldsTypeResponse)(nil), // 45: productv1.QueryNullableFieldsTypeResponse + (*QueryNullableFieldsTypeByIdRequest)(nil), // 46: productv1.QueryNullableFieldsTypeByIdRequest + (*QueryNullableFieldsTypeByIdResponse)(nil), // 47: productv1.QueryNullableFieldsTypeByIdResponse + (*QueryNullableFieldsTypeWithFilterRequest)(nil), // 48: productv1.QueryNullableFieldsTypeWithFilterRequest + (*QueryNullableFieldsTypeWithFilterResponse)(nil), // 49: productv1.QueryNullableFieldsTypeWithFilterResponse + (*QueryAllNullableFieldsTypesRequest)(nil), // 50: productv1.QueryAllNullableFieldsTypesRequest + (*QueryAllNullableFieldsTypesResponse)(nil), // 51: productv1.QueryAllNullableFieldsTypesResponse + (*QueryBlogPostRequest)(nil), // 52: productv1.QueryBlogPostRequest + (*QueryBlogPostResponse)(nil), // 53: productv1.QueryBlogPostResponse + (*QueryBlogPostByIdRequest)(nil), // 54: productv1.QueryBlogPostByIdRequest + (*QueryBlogPostByIdResponse)(nil), // 55: productv1.QueryBlogPostByIdResponse + (*QueryBlogPostsWithFilterRequest)(nil), // 56: productv1.QueryBlogPostsWithFilterRequest + (*QueryBlogPostsWithFilterResponse)(nil), // 57: productv1.QueryBlogPostsWithFilterResponse + (*QueryAllBlogPostsRequest)(nil), // 58: productv1.QueryAllBlogPostsRequest + (*QueryAllBlogPostsResponse)(nil), // 59: productv1.QueryAllBlogPostsResponse + (*QueryAuthorRequest)(nil), // 60: productv1.QueryAuthorRequest + (*QueryAuthorResponse)(nil), // 61: productv1.QueryAuthorResponse + (*QueryAuthorByIdRequest)(nil), // 62: productv1.QueryAuthorByIdRequest + (*QueryAuthorByIdResponse)(nil), // 63: productv1.QueryAuthorByIdResponse + (*QueryAuthorsWithFilterRequest)(nil), // 64: productv1.QueryAuthorsWithFilterRequest + (*QueryAuthorsWithFilterResponse)(nil), // 65: productv1.QueryAuthorsWithFilterResponse + (*QueryAllAuthorsRequest)(nil), // 66: productv1.QueryAllAuthorsRequest + (*QueryAllAuthorsResponse)(nil), // 67: productv1.QueryAllAuthorsResponse + (*MutationCreateUserRequest)(nil), // 68: productv1.MutationCreateUserRequest + (*MutationCreateUserResponse)(nil), // 69: productv1.MutationCreateUserResponse + (*MutationPerformActionRequest)(nil), // 70: productv1.MutationPerformActionRequest + (*MutationPerformActionResponse)(nil), // 71: productv1.MutationPerformActionResponse + (*MutationCreateNullableFieldsTypeRequest)(nil), // 72: productv1.MutationCreateNullableFieldsTypeRequest + (*MutationCreateNullableFieldsTypeResponse)(nil), // 73: productv1.MutationCreateNullableFieldsTypeResponse + (*MutationUpdateNullableFieldsTypeRequest)(nil), // 74: productv1.MutationUpdateNullableFieldsTypeRequest + (*MutationUpdateNullableFieldsTypeResponse)(nil), // 75: productv1.MutationUpdateNullableFieldsTypeResponse + (*MutationCreateBlogPostRequest)(nil), // 76: productv1.MutationCreateBlogPostRequest + (*MutationCreateBlogPostResponse)(nil), // 77: productv1.MutationCreateBlogPostResponse + (*MutationUpdateBlogPostRequest)(nil), // 78: productv1.MutationUpdateBlogPostRequest + (*MutationUpdateBlogPostResponse)(nil), // 79: productv1.MutationUpdateBlogPostResponse + (*MutationCreateAuthorRequest)(nil), // 80: productv1.MutationCreateAuthorRequest + (*MutationCreateAuthorResponse)(nil), // 81: productv1.MutationCreateAuthorResponse + (*MutationUpdateAuthorRequest)(nil), // 82: productv1.MutationUpdateAuthorRequest + (*MutationUpdateAuthorResponse)(nil), // 83: productv1.MutationUpdateAuthorResponse + (*Product)(nil), // 84: productv1.Product + (*Storage)(nil), // 85: productv1.Storage + (*User)(nil), // 86: productv1.User + (*NestedTypeA)(nil), // 87: productv1.NestedTypeA + (*RecursiveType)(nil), // 88: productv1.RecursiveType + (*TypeWithMultipleFilterFields)(nil), // 89: productv1.TypeWithMultipleFilterFields + (*FilterTypeInput)(nil), // 90: productv1.FilterTypeInput + (*ComplexFilterTypeInput)(nil), // 91: productv1.ComplexFilterTypeInput + (*TypeWithComplexFilterInput)(nil), // 92: productv1.TypeWithComplexFilterInput + (*OrderInput)(nil), // 93: productv1.OrderInput + (*Order)(nil), // 94: productv1.Order + (*Category)(nil), // 95: productv1.Category + (*CategoryFilter)(nil), // 96: productv1.CategoryFilter + (*Animal)(nil), // 97: productv1.Animal + (*SearchInput)(nil), // 98: productv1.SearchInput + (*SearchResult)(nil), // 99: productv1.SearchResult + (*NullableFieldsType)(nil), // 100: productv1.NullableFieldsType + (*NullableFieldsFilter)(nil), // 101: productv1.NullableFieldsFilter + (*BlogPost)(nil), // 102: productv1.BlogPost + (*BlogPostFilter)(nil), // 103: productv1.BlogPostFilter + (*Author)(nil), // 104: productv1.Author + (*AuthorFilter)(nil), // 105: productv1.AuthorFilter + (*UserInput)(nil), // 106: productv1.UserInput + (*ActionInput)(nil), // 107: productv1.ActionInput + (*ActionResult)(nil), // 108: productv1.ActionResult + (*NullableFieldsInput)(nil), // 109: productv1.NullableFieldsInput + (*BlogPostInput)(nil), // 110: productv1.BlogPostInput + (*AuthorInput)(nil), // 111: productv1.AuthorInput + (*NestedTypeB)(nil), // 112: productv1.NestedTypeB + (*NestedTypeC)(nil), // 113: productv1.NestedTypeC + (*FilterType)(nil), // 114: productv1.FilterType + (*Pagination)(nil), // 115: productv1.Pagination + (*OrderLineInput)(nil), // 116: productv1.OrderLineInput + (*OrderLine)(nil), // 117: productv1.OrderLine + (*Cat)(nil), // 118: productv1.Cat + (*Dog)(nil), // 119: productv1.Dog + (*ActionSuccess)(nil), // 120: productv1.ActionSuccess + (*ActionError)(nil), // 121: productv1.ActionError + (*CategoryInput)(nil), // 122: productv1.CategoryInput + (*ListOfListOfString_List)(nil), // 123: productv1.ListOfListOfString.List + (*wrapperspb.Int32Value)(nil), // 124: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 125: google.protobuf.StringValue + (*wrapperspb.DoubleValue)(nil), // 126: google.protobuf.DoubleValue + (*wrapperspb.BoolValue)(nil), // 127: google.protobuf.BoolValue } var file_product_proto_depIdxs = []int32{ - 84, // 0: productv1.ListOfOrderLine.items:type_name -> productv1.OrderLine - 3, // 1: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey - 57, // 2: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product - 6, // 3: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey - 58, // 4: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage - 59, // 5: productv1.QueryUsersResponse.users:type_name -> productv1.User - 59, // 6: productv1.QueryUserResponse.user:type_name -> productv1.User - 60, // 7: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA - 61, // 8: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType - 62, // 9: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields - 63, // 10: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput - 62, // 11: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields - 64, // 12: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput - 65, // 13: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput - 66, // 14: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput - 67, // 15: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order - 68, // 16: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category - 0, // 17: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind - 68, // 18: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category - 0, // 19: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind - 68, // 20: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category - 69, // 21: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter - 68, // 22: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category - 70, // 23: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal - 70, // 24: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal - 71, // 25: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput - 72, // 26: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult - 72, // 27: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult - 73, // 28: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType - 73, // 29: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType - 74, // 30: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter - 73, // 31: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType - 73, // 32: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType - 75, // 33: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput - 59, // 34: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User - 76, // 35: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput - 77, // 36: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult - 78, // 37: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 73, // 38: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType - 78, // 39: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 73, // 40: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType - 79, // 41: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB - 61, // 42: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType - 81, // 43: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType - 83, // 44: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput - 1, // 45: productv1.Order.order_lines:type_name -> productv1.ListOfOrderLine - 0, // 46: productv1.Category.kind:type_name -> productv1.CategoryKind - 0, // 47: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind - 82, // 48: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination - 85, // 49: productv1.Animal.cat:type_name -> productv1.Cat - 86, // 50: productv1.Animal.dog:type_name -> productv1.Dog - 89, // 51: productv1.SearchInput.limit:type_name -> google.protobuf.Int32Value - 57, // 52: productv1.SearchResult.product:type_name -> productv1.Product - 59, // 53: productv1.SearchResult.user:type_name -> productv1.User - 68, // 54: productv1.SearchResult.category:type_name -> productv1.Category - 90, // 55: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue - 89, // 56: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value - 91, // 57: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.DoubleValue - 92, // 58: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue - 90, // 59: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue - 90, // 60: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue - 92, // 61: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue - 87, // 62: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess - 88, // 63: productv1.ActionResult.action_error:type_name -> productv1.ActionError - 90, // 64: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue - 89, // 65: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value - 91, // 66: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.DoubleValue - 92, // 67: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue - 80, // 68: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC - 82, // 69: productv1.FilterType.pagination:type_name -> productv1.Pagination - 2, // 70: productv1.OrderLineInput.modifiers:type_name -> productv1.ListOfString - 2, // 71: productv1.OrderLine.modifiers:type_name -> productv1.ListOfString - 4, // 72: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest - 7, // 73: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest - 53, // 74: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest - 49, // 75: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest - 51, // 76: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest - 55, // 77: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest - 47, // 78: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest - 35, // 79: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest - 23, // 80: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest - 25, // 81: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest - 27, // 82: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest - 29, // 83: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest - 21, // 84: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest - 31, // 85: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest - 13, // 86: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest - 41, // 87: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest - 43, // 88: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest - 45, // 89: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest - 33, // 90: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest - 39, // 91: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest - 15, // 92: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest - 37, // 93: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest - 17, // 94: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest - 19, // 95: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest - 11, // 96: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest - 9, // 97: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest - 5, // 98: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse - 8, // 99: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse - 54, // 100: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse - 50, // 101: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse - 52, // 102: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse - 56, // 103: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse - 48, // 104: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse - 36, // 105: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse - 24, // 106: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse - 26, // 107: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse - 28, // 108: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse - 30, // 109: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse - 22, // 110: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse - 32, // 111: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse - 14, // 112: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse - 42, // 113: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse - 44, // 114: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse - 46, // 115: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse - 34, // 116: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse - 40, // 117: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse - 16, // 118: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse - 38, // 119: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse - 18, // 120: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse - 20, // 121: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse - 12, // 122: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse - 10, // 123: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse - 98, // [98:124] is the sub-list for method output_type - 72, // [72:98] is the sub-list for method input_type - 72, // [72:72] is the sub-list for extension type_name - 72, // [72:72] is the sub-list for extension extendee - 0, // [0:72] is the sub-list for field type_name + 123, // 0: productv1.ListOfListOfString.list:type_name -> productv1.ListOfListOfString.List + 117, // 1: productv1.ListOfOrderLine.items:type_name -> productv1.OrderLine + 6, // 2: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey + 84, // 3: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product + 9, // 4: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey + 85, // 5: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage + 86, // 6: productv1.QueryUsersResponse.users:type_name -> productv1.User + 86, // 7: productv1.QueryUserResponse.user:type_name -> productv1.User + 87, // 8: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA + 88, // 9: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType + 89, // 10: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields + 90, // 11: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput + 89, // 12: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields + 91, // 13: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput + 92, // 14: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput + 93, // 15: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput + 94, // 16: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order + 95, // 17: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category + 0, // 18: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind + 95, // 19: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category + 0, // 20: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind + 95, // 21: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category + 96, // 22: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter + 95, // 23: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category + 97, // 24: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal + 97, // 25: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal + 98, // 26: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput + 99, // 27: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult + 99, // 28: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult + 100, // 29: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType + 100, // 30: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType + 101, // 31: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter + 100, // 32: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType + 100, // 33: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType + 102, // 34: productv1.QueryBlogPostResponse.blog_post:type_name -> productv1.BlogPost + 102, // 35: productv1.QueryBlogPostByIdResponse.blog_post_by_id:type_name -> productv1.BlogPost + 103, // 36: productv1.QueryBlogPostsWithFilterRequest.filter:type_name -> productv1.BlogPostFilter + 102, // 37: productv1.QueryBlogPostsWithFilterResponse.blog_posts_with_filter:type_name -> productv1.BlogPost + 102, // 38: productv1.QueryAllBlogPostsResponse.all_blog_posts:type_name -> productv1.BlogPost + 104, // 39: productv1.QueryAuthorResponse.author:type_name -> productv1.Author + 104, // 40: productv1.QueryAuthorByIdResponse.author_by_id:type_name -> productv1.Author + 105, // 41: productv1.QueryAuthorsWithFilterRequest.filter:type_name -> productv1.AuthorFilter + 104, // 42: productv1.QueryAuthorsWithFilterResponse.authors_with_filter:type_name -> productv1.Author + 104, // 43: productv1.QueryAllAuthorsResponse.all_authors:type_name -> productv1.Author + 106, // 44: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput + 86, // 45: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User + 107, // 46: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput + 108, // 47: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult + 109, // 48: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 100, // 49: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType + 109, // 50: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 100, // 51: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType + 110, // 52: productv1.MutationCreateBlogPostRequest.input:type_name -> productv1.BlogPostInput + 102, // 53: productv1.MutationCreateBlogPostResponse.create_blog_post:type_name -> productv1.BlogPost + 110, // 54: productv1.MutationUpdateBlogPostRequest.input:type_name -> productv1.BlogPostInput + 102, // 55: productv1.MutationUpdateBlogPostResponse.update_blog_post:type_name -> productv1.BlogPost + 111, // 56: productv1.MutationCreateAuthorRequest.input:type_name -> productv1.AuthorInput + 104, // 57: productv1.MutationCreateAuthorResponse.create_author:type_name -> productv1.Author + 111, // 58: productv1.MutationUpdateAuthorRequest.input:type_name -> productv1.AuthorInput + 104, // 59: productv1.MutationUpdateAuthorResponse.update_author:type_name -> productv1.Author + 112, // 60: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB + 88, // 61: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType + 114, // 62: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType + 116, // 63: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput + 4, // 64: productv1.Order.order_lines:type_name -> productv1.ListOfOrderLine + 0, // 65: productv1.Category.kind:type_name -> productv1.CategoryKind + 0, // 66: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind + 115, // 67: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination + 118, // 68: productv1.Animal.cat:type_name -> productv1.Cat + 119, // 69: productv1.Animal.dog:type_name -> productv1.Dog + 124, // 70: productv1.SearchInput.limit:type_name -> google.protobuf.Int32Value + 84, // 71: productv1.SearchResult.product:type_name -> productv1.Product + 86, // 72: productv1.SearchResult.user:type_name -> productv1.User + 95, // 73: productv1.SearchResult.category:type_name -> productv1.Category + 125, // 74: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue + 124, // 75: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value + 126, // 76: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.DoubleValue + 127, // 77: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue + 125, // 78: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue + 125, // 79: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue + 127, // 80: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue + 5, // 81: productv1.BlogPost.optional_tags:type_name -> productv1.ListOfString + 5, // 82: productv1.BlogPost.keywords:type_name -> productv1.ListOfString + 2, // 83: productv1.BlogPost.ratings:type_name -> productv1.ListOfFloat + 1, // 84: productv1.BlogPost.is_published:type_name -> productv1.ListOfBoolean + 3, // 85: productv1.BlogPost.tag_groups:type_name -> productv1.ListOfListOfString + 3, // 86: productv1.BlogPost.related_topics:type_name -> productv1.ListOfListOfString + 3, // 87: productv1.BlogPost.comment_threads:type_name -> productv1.ListOfListOfString + 3, // 88: productv1.BlogPost.suggestions:type_name -> productv1.ListOfListOfString + 125, // 89: productv1.BlogPostFilter.title:type_name -> google.protobuf.StringValue + 127, // 90: productv1.BlogPostFilter.has_categories:type_name -> google.protobuf.BoolValue + 124, // 91: productv1.BlogPostFilter.min_tags:type_name -> google.protobuf.Int32Value + 125, // 92: productv1.Author.email:type_name -> google.protobuf.StringValue + 5, // 93: productv1.Author.social_links:type_name -> productv1.ListOfString + 3, // 94: productv1.Author.teams_by_project:type_name -> productv1.ListOfListOfString + 3, // 95: productv1.Author.collaborations:type_name -> productv1.ListOfListOfString + 125, // 96: productv1.AuthorFilter.name:type_name -> google.protobuf.StringValue + 127, // 97: productv1.AuthorFilter.has_teams:type_name -> google.protobuf.BoolValue + 124, // 98: productv1.AuthorFilter.skill_count:type_name -> google.protobuf.Int32Value + 120, // 99: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess + 121, // 100: productv1.ActionResult.action_error:type_name -> productv1.ActionError + 125, // 101: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue + 124, // 102: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value + 126, // 103: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.DoubleValue + 127, // 104: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue + 5, // 105: productv1.BlogPostInput.optional_tags:type_name -> productv1.ListOfString + 5, // 106: productv1.BlogPostInput.keywords:type_name -> productv1.ListOfString + 2, // 107: productv1.BlogPostInput.ratings:type_name -> productv1.ListOfFloat + 1, // 108: productv1.BlogPostInput.is_published:type_name -> productv1.ListOfBoolean + 3, // 109: productv1.BlogPostInput.tag_groups:type_name -> productv1.ListOfListOfString + 3, // 110: productv1.BlogPostInput.related_topics:type_name -> productv1.ListOfListOfString + 3, // 111: productv1.BlogPostInput.comment_threads:type_name -> productv1.ListOfListOfString + 3, // 112: productv1.BlogPostInput.suggestions:type_name -> productv1.ListOfListOfString + 125, // 113: productv1.AuthorInput.email:type_name -> google.protobuf.StringValue + 5, // 114: productv1.AuthorInput.social_links:type_name -> productv1.ListOfString + 3, // 115: productv1.AuthorInput.teams_by_project:type_name -> productv1.ListOfListOfString + 3, // 116: productv1.AuthorInput.collaborations:type_name -> productv1.ListOfListOfString + 113, // 117: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC + 115, // 118: productv1.FilterType.pagination:type_name -> productv1.Pagination + 5, // 119: productv1.OrderLineInput.modifiers:type_name -> productv1.ListOfString + 5, // 120: productv1.OrderLine.modifiers:type_name -> productv1.ListOfString + 0, // 121: productv1.CategoryInput.kind:type_name -> productv1.CategoryKind + 5, // 122: productv1.ListOfListOfString.List.items:type_name -> productv1.ListOfString + 7, // 123: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest + 10, // 124: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest + 80, // 125: productv1.ProductService.MutationCreateAuthor:input_type -> productv1.MutationCreateAuthorRequest + 76, // 126: productv1.ProductService.MutationCreateBlogPost:input_type -> productv1.MutationCreateBlogPostRequest + 72, // 127: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest + 68, // 128: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest + 70, // 129: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest + 82, // 130: productv1.ProductService.MutationUpdateAuthor:input_type -> productv1.MutationUpdateAuthorRequest + 78, // 131: productv1.ProductService.MutationUpdateBlogPost:input_type -> productv1.MutationUpdateBlogPostRequest + 74, // 132: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest + 66, // 133: productv1.ProductService.QueryAllAuthors:input_type -> productv1.QueryAllAuthorsRequest + 58, // 134: productv1.ProductService.QueryAllBlogPosts:input_type -> productv1.QueryAllBlogPostsRequest + 50, // 135: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest + 38, // 136: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest + 60, // 137: productv1.ProductService.QueryAuthor:input_type -> productv1.QueryAuthorRequest + 62, // 138: productv1.ProductService.QueryAuthorById:input_type -> productv1.QueryAuthorByIdRequest + 64, // 139: productv1.ProductService.QueryAuthorsWithFilter:input_type -> productv1.QueryAuthorsWithFilterRequest + 52, // 140: productv1.ProductService.QueryBlogPost:input_type -> productv1.QueryBlogPostRequest + 54, // 141: productv1.ProductService.QueryBlogPostById:input_type -> productv1.QueryBlogPostByIdRequest + 56, // 142: productv1.ProductService.QueryBlogPostsWithFilter:input_type -> productv1.QueryBlogPostsWithFilterRequest + 26, // 143: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest + 28, // 144: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest + 30, // 145: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest + 32, // 146: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest + 24, // 147: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest + 34, // 148: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest + 16, // 149: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest + 44, // 150: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest + 46, // 151: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest + 48, // 152: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest + 36, // 153: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest + 42, // 154: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest + 18, // 155: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest + 40, // 156: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest + 20, // 157: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest + 22, // 158: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest + 14, // 159: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest + 12, // 160: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest + 8, // 161: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse + 11, // 162: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse + 81, // 163: productv1.ProductService.MutationCreateAuthor:output_type -> productv1.MutationCreateAuthorResponse + 77, // 164: productv1.ProductService.MutationCreateBlogPost:output_type -> productv1.MutationCreateBlogPostResponse + 73, // 165: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse + 69, // 166: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse + 71, // 167: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse + 83, // 168: productv1.ProductService.MutationUpdateAuthor:output_type -> productv1.MutationUpdateAuthorResponse + 79, // 169: productv1.ProductService.MutationUpdateBlogPost:output_type -> productv1.MutationUpdateBlogPostResponse + 75, // 170: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse + 67, // 171: productv1.ProductService.QueryAllAuthors:output_type -> productv1.QueryAllAuthorsResponse + 59, // 172: productv1.ProductService.QueryAllBlogPosts:output_type -> productv1.QueryAllBlogPostsResponse + 51, // 173: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse + 39, // 174: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse + 61, // 175: productv1.ProductService.QueryAuthor:output_type -> productv1.QueryAuthorResponse + 63, // 176: productv1.ProductService.QueryAuthorById:output_type -> productv1.QueryAuthorByIdResponse + 65, // 177: productv1.ProductService.QueryAuthorsWithFilter:output_type -> productv1.QueryAuthorsWithFilterResponse + 53, // 178: productv1.ProductService.QueryBlogPost:output_type -> productv1.QueryBlogPostResponse + 55, // 179: productv1.ProductService.QueryBlogPostById:output_type -> productv1.QueryBlogPostByIdResponse + 57, // 180: productv1.ProductService.QueryBlogPostsWithFilter:output_type -> productv1.QueryBlogPostsWithFilterResponse + 27, // 181: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse + 29, // 182: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse + 31, // 183: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse + 33, // 184: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse + 25, // 185: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse + 35, // 186: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse + 17, // 187: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse + 45, // 188: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse + 47, // 189: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse + 49, // 190: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse + 37, // 191: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse + 43, // 192: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse + 19, // 193: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse + 41, // 194: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse + 21, // 195: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse + 23, // 196: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse + 15, // 197: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse + 13, // 198: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse + 161, // [161:199] is the sub-list for method output_type + 123, // [123:161] is the sub-list for method input_type + 123, // [123:123] is the sub-list for extension type_name + 123, // [123:123] is the sub-list for extension extendee + 0, // [0:123] is the sub-list for field type_name } func init() { file_product_proto_init() } @@ -5114,16 +7255,16 @@ func file_product_proto_init() { if File_product_proto != nil { return } - file_product_proto_msgTypes[69].OneofWrappers = []any{ + file_product_proto_msgTypes[96].OneofWrappers = []any{ (*Animal_Cat)(nil), (*Animal_Dog)(nil), } - file_product_proto_msgTypes[71].OneofWrappers = []any{ + file_product_proto_msgTypes[98].OneofWrappers = []any{ (*SearchResult_Product)(nil), (*SearchResult_User)(nil), (*SearchResult_Category)(nil), } - file_product_proto_msgTypes[76].OneofWrappers = []any{ + file_product_proto_msgTypes[107].OneofWrappers = []any{ (*ActionResult_ActionSuccess)(nil), (*ActionResult_ActionError)(nil), } @@ -5133,7 +7274,7 @@ func file_product_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_product_proto_rawDesc), len(file_product_proto_rawDesc)), NumEnums: 1, - NumMessages: 88, + NumMessages: 123, NumExtensions: 0, NumServices: 1, }, diff --git a/v2/pkg/grpctest/productv1/product_grpc.pb.go b/v2/pkg/grpctest/productv1/product_grpc.pb.go index 5a9c27deb2..431976d8f2 100644 --- a/v2/pkg/grpctest/productv1/product_grpc.pb.go +++ b/v2/pkg/grpctest/productv1/product_grpc.pb.go @@ -21,12 +21,24 @@ const _ = grpc.SupportPackageIsVersion9 const ( ProductService_LookupProductById_FullMethodName = "/productv1.ProductService/LookupProductById" ProductService_LookupStorageById_FullMethodName = "/productv1.ProductService/LookupStorageById" + ProductService_MutationCreateAuthor_FullMethodName = "/productv1.ProductService/MutationCreateAuthor" + ProductService_MutationCreateBlogPost_FullMethodName = "/productv1.ProductService/MutationCreateBlogPost" ProductService_MutationCreateNullableFieldsType_FullMethodName = "/productv1.ProductService/MutationCreateNullableFieldsType" ProductService_MutationCreateUser_FullMethodName = "/productv1.ProductService/MutationCreateUser" ProductService_MutationPerformAction_FullMethodName = "/productv1.ProductService/MutationPerformAction" + ProductService_MutationUpdateAuthor_FullMethodName = "/productv1.ProductService/MutationUpdateAuthor" + ProductService_MutationUpdateBlogPost_FullMethodName = "/productv1.ProductService/MutationUpdateBlogPost" ProductService_MutationUpdateNullableFieldsType_FullMethodName = "/productv1.ProductService/MutationUpdateNullableFieldsType" + ProductService_QueryAllAuthors_FullMethodName = "/productv1.ProductService/QueryAllAuthors" + ProductService_QueryAllBlogPosts_FullMethodName = "/productv1.ProductService/QueryAllBlogPosts" ProductService_QueryAllNullableFieldsTypes_FullMethodName = "/productv1.ProductService/QueryAllNullableFieldsTypes" ProductService_QueryAllPets_FullMethodName = "/productv1.ProductService/QueryAllPets" + ProductService_QueryAuthor_FullMethodName = "/productv1.ProductService/QueryAuthor" + ProductService_QueryAuthorById_FullMethodName = "/productv1.ProductService/QueryAuthorById" + ProductService_QueryAuthorsWithFilter_FullMethodName = "/productv1.ProductService/QueryAuthorsWithFilter" + ProductService_QueryBlogPost_FullMethodName = "/productv1.ProductService/QueryBlogPost" + ProductService_QueryBlogPostById_FullMethodName = "/productv1.ProductService/QueryBlogPostById" + ProductService_QueryBlogPostsWithFilter_FullMethodName = "/productv1.ProductService/QueryBlogPostsWithFilter" ProductService_QueryCalculateTotals_FullMethodName = "/productv1.ProductService/QueryCalculateTotals" ProductService_QueryCategories_FullMethodName = "/productv1.ProductService/QueryCategories" ProductService_QueryCategoriesByKind_FullMethodName = "/productv1.ProductService/QueryCategoriesByKind" @@ -57,12 +69,24 @@ type ProductServiceClient interface { LookupProductById(ctx context.Context, in *LookupProductByIdRequest, opts ...grpc.CallOption) (*LookupProductByIdResponse, error) // Lookup Storage entity by id LookupStorageById(ctx context.Context, in *LookupStorageByIdRequest, opts ...grpc.CallOption) (*LookupStorageByIdResponse, error) + MutationCreateAuthor(ctx context.Context, in *MutationCreateAuthorRequest, opts ...grpc.CallOption) (*MutationCreateAuthorResponse, error) + MutationCreateBlogPost(ctx context.Context, in *MutationCreateBlogPostRequest, opts ...grpc.CallOption) (*MutationCreateBlogPostResponse, error) MutationCreateNullableFieldsType(ctx context.Context, in *MutationCreateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationCreateNullableFieldsTypeResponse, error) MutationCreateUser(ctx context.Context, in *MutationCreateUserRequest, opts ...grpc.CallOption) (*MutationCreateUserResponse, error) MutationPerformAction(ctx context.Context, in *MutationPerformActionRequest, opts ...grpc.CallOption) (*MutationPerformActionResponse, error) + MutationUpdateAuthor(ctx context.Context, in *MutationUpdateAuthorRequest, opts ...grpc.CallOption) (*MutationUpdateAuthorResponse, error) + MutationUpdateBlogPost(ctx context.Context, in *MutationUpdateBlogPostRequest, opts ...grpc.CallOption) (*MutationUpdateBlogPostResponse, error) MutationUpdateNullableFieldsType(ctx context.Context, in *MutationUpdateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationUpdateNullableFieldsTypeResponse, error) + QueryAllAuthors(ctx context.Context, in *QueryAllAuthorsRequest, opts ...grpc.CallOption) (*QueryAllAuthorsResponse, error) + QueryAllBlogPosts(ctx context.Context, in *QueryAllBlogPostsRequest, opts ...grpc.CallOption) (*QueryAllBlogPostsResponse, error) QueryAllNullableFieldsTypes(ctx context.Context, in *QueryAllNullableFieldsTypesRequest, opts ...grpc.CallOption) (*QueryAllNullableFieldsTypesResponse, error) QueryAllPets(ctx context.Context, in *QueryAllPetsRequest, opts ...grpc.CallOption) (*QueryAllPetsResponse, error) + QueryAuthor(ctx context.Context, in *QueryAuthorRequest, opts ...grpc.CallOption) (*QueryAuthorResponse, error) + QueryAuthorById(ctx context.Context, in *QueryAuthorByIdRequest, opts ...grpc.CallOption) (*QueryAuthorByIdResponse, error) + QueryAuthorsWithFilter(ctx context.Context, in *QueryAuthorsWithFilterRequest, opts ...grpc.CallOption) (*QueryAuthorsWithFilterResponse, error) + QueryBlogPost(ctx context.Context, in *QueryBlogPostRequest, opts ...grpc.CallOption) (*QueryBlogPostResponse, error) + QueryBlogPostById(ctx context.Context, in *QueryBlogPostByIdRequest, opts ...grpc.CallOption) (*QueryBlogPostByIdResponse, error) + QueryBlogPostsWithFilter(ctx context.Context, in *QueryBlogPostsWithFilterRequest, opts ...grpc.CallOption) (*QueryBlogPostsWithFilterResponse, error) QueryCalculateTotals(ctx context.Context, in *QueryCalculateTotalsRequest, opts ...grpc.CallOption) (*QueryCalculateTotalsResponse, error) QueryCategories(ctx context.Context, in *QueryCategoriesRequest, opts ...grpc.CallOption) (*QueryCategoriesResponse, error) QueryCategoriesByKind(ctx context.Context, in *QueryCategoriesByKindRequest, opts ...grpc.CallOption) (*QueryCategoriesByKindResponse, error) @@ -111,6 +135,26 @@ func (c *productServiceClient) LookupStorageById(ctx context.Context, in *Lookup return out, nil } +func (c *productServiceClient) MutationCreateAuthor(ctx context.Context, in *MutationCreateAuthorRequest, opts ...grpc.CallOption) (*MutationCreateAuthorResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(MutationCreateAuthorResponse) + err := c.cc.Invoke(ctx, ProductService_MutationCreateAuthor_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) MutationCreateBlogPost(ctx context.Context, in *MutationCreateBlogPostRequest, opts ...grpc.CallOption) (*MutationCreateBlogPostResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(MutationCreateBlogPostResponse) + err := c.cc.Invoke(ctx, ProductService_MutationCreateBlogPost_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) MutationCreateNullableFieldsType(ctx context.Context, in *MutationCreateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationCreateNullableFieldsTypeResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(MutationCreateNullableFieldsTypeResponse) @@ -141,6 +185,26 @@ func (c *productServiceClient) MutationPerformAction(ctx context.Context, in *Mu return out, nil } +func (c *productServiceClient) MutationUpdateAuthor(ctx context.Context, in *MutationUpdateAuthorRequest, opts ...grpc.CallOption) (*MutationUpdateAuthorResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(MutationUpdateAuthorResponse) + err := c.cc.Invoke(ctx, ProductService_MutationUpdateAuthor_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) MutationUpdateBlogPost(ctx context.Context, in *MutationUpdateBlogPostRequest, opts ...grpc.CallOption) (*MutationUpdateBlogPostResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(MutationUpdateBlogPostResponse) + err := c.cc.Invoke(ctx, ProductService_MutationUpdateBlogPost_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) MutationUpdateNullableFieldsType(ctx context.Context, in *MutationUpdateNullableFieldsTypeRequest, opts ...grpc.CallOption) (*MutationUpdateNullableFieldsTypeResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(MutationUpdateNullableFieldsTypeResponse) @@ -151,6 +215,26 @@ func (c *productServiceClient) MutationUpdateNullableFieldsType(ctx context.Cont return out, nil } +func (c *productServiceClient) QueryAllAuthors(ctx context.Context, in *QueryAllAuthorsRequest, opts ...grpc.CallOption) (*QueryAllAuthorsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryAllAuthorsResponse) + err := c.cc.Invoke(ctx, ProductService_QueryAllAuthors_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryAllBlogPosts(ctx context.Context, in *QueryAllBlogPostsRequest, opts ...grpc.CallOption) (*QueryAllBlogPostsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryAllBlogPostsResponse) + err := c.cc.Invoke(ctx, ProductService_QueryAllBlogPosts_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) QueryAllNullableFieldsTypes(ctx context.Context, in *QueryAllNullableFieldsTypesRequest, opts ...grpc.CallOption) (*QueryAllNullableFieldsTypesResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(QueryAllNullableFieldsTypesResponse) @@ -171,6 +255,66 @@ func (c *productServiceClient) QueryAllPets(ctx context.Context, in *QueryAllPet return out, nil } +func (c *productServiceClient) QueryAuthor(ctx context.Context, in *QueryAuthorRequest, opts ...grpc.CallOption) (*QueryAuthorResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryAuthorResponse) + err := c.cc.Invoke(ctx, ProductService_QueryAuthor_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryAuthorById(ctx context.Context, in *QueryAuthorByIdRequest, opts ...grpc.CallOption) (*QueryAuthorByIdResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryAuthorByIdResponse) + err := c.cc.Invoke(ctx, ProductService_QueryAuthorById_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryAuthorsWithFilter(ctx context.Context, in *QueryAuthorsWithFilterRequest, opts ...grpc.CallOption) (*QueryAuthorsWithFilterResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryAuthorsWithFilterResponse) + err := c.cc.Invoke(ctx, ProductService_QueryAuthorsWithFilter_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryBlogPost(ctx context.Context, in *QueryBlogPostRequest, opts ...grpc.CallOption) (*QueryBlogPostResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryBlogPostResponse) + err := c.cc.Invoke(ctx, ProductService_QueryBlogPost_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryBlogPostById(ctx context.Context, in *QueryBlogPostByIdRequest, opts ...grpc.CallOption) (*QueryBlogPostByIdResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryBlogPostByIdResponse) + err := c.cc.Invoke(ctx, ProductService_QueryBlogPostById_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) QueryBlogPostsWithFilter(ctx context.Context, in *QueryBlogPostsWithFilterRequest, opts ...grpc.CallOption) (*QueryBlogPostsWithFilterResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryBlogPostsWithFilterResponse) + err := c.cc.Invoke(ctx, ProductService_QueryBlogPostsWithFilter_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) QueryCalculateTotals(ctx context.Context, in *QueryCalculateTotalsRequest, opts ...grpc.CallOption) (*QueryCalculateTotalsResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(QueryCalculateTotalsResponse) @@ -361,12 +505,24 @@ type ProductServiceServer interface { LookupProductById(context.Context, *LookupProductByIdRequest) (*LookupProductByIdResponse, error) // Lookup Storage entity by id LookupStorageById(context.Context, *LookupStorageByIdRequest) (*LookupStorageByIdResponse, error) + MutationCreateAuthor(context.Context, *MutationCreateAuthorRequest) (*MutationCreateAuthorResponse, error) + MutationCreateBlogPost(context.Context, *MutationCreateBlogPostRequest) (*MutationCreateBlogPostResponse, error) MutationCreateNullableFieldsType(context.Context, *MutationCreateNullableFieldsTypeRequest) (*MutationCreateNullableFieldsTypeResponse, error) MutationCreateUser(context.Context, *MutationCreateUserRequest) (*MutationCreateUserResponse, error) MutationPerformAction(context.Context, *MutationPerformActionRequest) (*MutationPerformActionResponse, error) + MutationUpdateAuthor(context.Context, *MutationUpdateAuthorRequest) (*MutationUpdateAuthorResponse, error) + MutationUpdateBlogPost(context.Context, *MutationUpdateBlogPostRequest) (*MutationUpdateBlogPostResponse, error) MutationUpdateNullableFieldsType(context.Context, *MutationUpdateNullableFieldsTypeRequest) (*MutationUpdateNullableFieldsTypeResponse, error) + QueryAllAuthors(context.Context, *QueryAllAuthorsRequest) (*QueryAllAuthorsResponse, error) + QueryAllBlogPosts(context.Context, *QueryAllBlogPostsRequest) (*QueryAllBlogPostsResponse, error) QueryAllNullableFieldsTypes(context.Context, *QueryAllNullableFieldsTypesRequest) (*QueryAllNullableFieldsTypesResponse, error) QueryAllPets(context.Context, *QueryAllPetsRequest) (*QueryAllPetsResponse, error) + QueryAuthor(context.Context, *QueryAuthorRequest) (*QueryAuthorResponse, error) + QueryAuthorById(context.Context, *QueryAuthorByIdRequest) (*QueryAuthorByIdResponse, error) + QueryAuthorsWithFilter(context.Context, *QueryAuthorsWithFilterRequest) (*QueryAuthorsWithFilterResponse, error) + QueryBlogPost(context.Context, *QueryBlogPostRequest) (*QueryBlogPostResponse, error) + QueryBlogPostById(context.Context, *QueryBlogPostByIdRequest) (*QueryBlogPostByIdResponse, error) + QueryBlogPostsWithFilter(context.Context, *QueryBlogPostsWithFilterRequest) (*QueryBlogPostsWithFilterResponse, error) QueryCalculateTotals(context.Context, *QueryCalculateTotalsRequest) (*QueryCalculateTotalsResponse, error) QueryCategories(context.Context, *QueryCategoriesRequest) (*QueryCategoriesResponse, error) QueryCategoriesByKind(context.Context, *QueryCategoriesByKindRequest) (*QueryCategoriesByKindResponse, error) @@ -401,6 +557,12 @@ func (UnimplementedProductServiceServer) LookupProductById(context.Context, *Loo func (UnimplementedProductServiceServer) LookupStorageById(context.Context, *LookupStorageByIdRequest) (*LookupStorageByIdResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LookupStorageById not implemented") } +func (UnimplementedProductServiceServer) MutationCreateAuthor(context.Context, *MutationCreateAuthorRequest) (*MutationCreateAuthorResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MutationCreateAuthor not implemented") +} +func (UnimplementedProductServiceServer) MutationCreateBlogPost(context.Context, *MutationCreateBlogPostRequest) (*MutationCreateBlogPostResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MutationCreateBlogPost not implemented") +} func (UnimplementedProductServiceServer) MutationCreateNullableFieldsType(context.Context, *MutationCreateNullableFieldsTypeRequest) (*MutationCreateNullableFieldsTypeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MutationCreateNullableFieldsType not implemented") } @@ -410,15 +572,45 @@ func (UnimplementedProductServiceServer) MutationCreateUser(context.Context, *Mu func (UnimplementedProductServiceServer) MutationPerformAction(context.Context, *MutationPerformActionRequest) (*MutationPerformActionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MutationPerformAction not implemented") } +func (UnimplementedProductServiceServer) MutationUpdateAuthor(context.Context, *MutationUpdateAuthorRequest) (*MutationUpdateAuthorResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MutationUpdateAuthor not implemented") +} +func (UnimplementedProductServiceServer) MutationUpdateBlogPost(context.Context, *MutationUpdateBlogPostRequest) (*MutationUpdateBlogPostResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MutationUpdateBlogPost not implemented") +} func (UnimplementedProductServiceServer) MutationUpdateNullableFieldsType(context.Context, *MutationUpdateNullableFieldsTypeRequest) (*MutationUpdateNullableFieldsTypeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MutationUpdateNullableFieldsType not implemented") } +func (UnimplementedProductServiceServer) QueryAllAuthors(context.Context, *QueryAllAuthorsRequest) (*QueryAllAuthorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryAllAuthors not implemented") +} +func (UnimplementedProductServiceServer) QueryAllBlogPosts(context.Context, *QueryAllBlogPostsRequest) (*QueryAllBlogPostsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryAllBlogPosts not implemented") +} func (UnimplementedProductServiceServer) QueryAllNullableFieldsTypes(context.Context, *QueryAllNullableFieldsTypesRequest) (*QueryAllNullableFieldsTypesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryAllNullableFieldsTypes not implemented") } func (UnimplementedProductServiceServer) QueryAllPets(context.Context, *QueryAllPetsRequest) (*QueryAllPetsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryAllPets not implemented") } +func (UnimplementedProductServiceServer) QueryAuthor(context.Context, *QueryAuthorRequest) (*QueryAuthorResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryAuthor not implemented") +} +func (UnimplementedProductServiceServer) QueryAuthorById(context.Context, *QueryAuthorByIdRequest) (*QueryAuthorByIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryAuthorById not implemented") +} +func (UnimplementedProductServiceServer) QueryAuthorsWithFilter(context.Context, *QueryAuthorsWithFilterRequest) (*QueryAuthorsWithFilterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryAuthorsWithFilter not implemented") +} +func (UnimplementedProductServiceServer) QueryBlogPost(context.Context, *QueryBlogPostRequest) (*QueryBlogPostResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryBlogPost not implemented") +} +func (UnimplementedProductServiceServer) QueryBlogPostById(context.Context, *QueryBlogPostByIdRequest) (*QueryBlogPostByIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryBlogPostById not implemented") +} +func (UnimplementedProductServiceServer) QueryBlogPostsWithFilter(context.Context, *QueryBlogPostsWithFilterRequest) (*QueryBlogPostsWithFilterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryBlogPostsWithFilter not implemented") +} func (UnimplementedProductServiceServer) QueryCalculateTotals(context.Context, *QueryCalculateTotalsRequest) (*QueryCalculateTotalsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryCalculateTotals not implemented") } @@ -530,6 +722,42 @@ func _ProductService_LookupStorageById_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _ProductService_MutationCreateAuthor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MutationCreateAuthorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).MutationCreateAuthor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_MutationCreateAuthor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).MutationCreateAuthor(ctx, req.(*MutationCreateAuthorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_MutationCreateBlogPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MutationCreateBlogPostRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).MutationCreateBlogPost(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_MutationCreateBlogPost_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).MutationCreateBlogPost(ctx, req.(*MutationCreateBlogPostRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_MutationCreateNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MutationCreateNullableFieldsTypeRequest) if err := dec(in); err != nil { @@ -584,6 +812,42 @@ func _ProductService_MutationPerformAction_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ProductService_MutationUpdateAuthor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MutationUpdateAuthorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).MutationUpdateAuthor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_MutationUpdateAuthor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).MutationUpdateAuthor(ctx, req.(*MutationUpdateAuthorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_MutationUpdateBlogPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MutationUpdateBlogPostRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).MutationUpdateBlogPost(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_MutationUpdateBlogPost_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).MutationUpdateBlogPost(ctx, req.(*MutationUpdateBlogPostRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_MutationUpdateNullableFieldsType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MutationUpdateNullableFieldsTypeRequest) if err := dec(in); err != nil { @@ -602,6 +866,42 @@ func _ProductService_MutationUpdateNullableFieldsType_Handler(srv interface{}, c return interceptor(ctx, in, info, handler) } +func _ProductService_QueryAllAuthors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllAuthorsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryAllAuthors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryAllAuthors_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryAllAuthors(ctx, req.(*QueryAllAuthorsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryAllBlogPosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllBlogPostsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryAllBlogPosts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryAllBlogPosts_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryAllBlogPosts(ctx, req.(*QueryAllBlogPostsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_QueryAllNullableFieldsTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryAllNullableFieldsTypesRequest) if err := dec(in); err != nil { @@ -638,6 +938,114 @@ func _ProductService_QueryAllPets_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _ProductService_QueryAuthor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAuthorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryAuthor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryAuthor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryAuthor(ctx, req.(*QueryAuthorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryAuthorById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAuthorByIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryAuthorById(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryAuthorById_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryAuthorById(ctx, req.(*QueryAuthorByIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryAuthorsWithFilter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAuthorsWithFilterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryAuthorsWithFilter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryAuthorsWithFilter_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryAuthorsWithFilter(ctx, req.(*QueryAuthorsWithFilterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryBlogPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryBlogPostRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryBlogPost(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryBlogPost_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryBlogPost(ctx, req.(*QueryBlogPostRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryBlogPostById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryBlogPostByIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryBlogPostById(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryBlogPostById_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryBlogPostById(ctx, req.(*QueryBlogPostByIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_QueryBlogPostsWithFilter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryBlogPostsWithFilterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).QueryBlogPostsWithFilter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_QueryBlogPostsWithFilter_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).QueryBlogPostsWithFilter(ctx, req.(*QueryBlogPostsWithFilterRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_QueryCalculateTotals_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryCalculateTotalsRequest) if err := dec(in); err != nil { @@ -977,6 +1385,14 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "LookupStorageById", Handler: _ProductService_LookupStorageById_Handler, }, + { + MethodName: "MutationCreateAuthor", + Handler: _ProductService_MutationCreateAuthor_Handler, + }, + { + MethodName: "MutationCreateBlogPost", + Handler: _ProductService_MutationCreateBlogPost_Handler, + }, { MethodName: "MutationCreateNullableFieldsType", Handler: _ProductService_MutationCreateNullableFieldsType_Handler, @@ -989,10 +1405,26 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "MutationPerformAction", Handler: _ProductService_MutationPerformAction_Handler, }, + { + MethodName: "MutationUpdateAuthor", + Handler: _ProductService_MutationUpdateAuthor_Handler, + }, + { + MethodName: "MutationUpdateBlogPost", + Handler: _ProductService_MutationUpdateBlogPost_Handler, + }, { MethodName: "MutationUpdateNullableFieldsType", Handler: _ProductService_MutationUpdateNullableFieldsType_Handler, }, + { + MethodName: "QueryAllAuthors", + Handler: _ProductService_QueryAllAuthors_Handler, + }, + { + MethodName: "QueryAllBlogPosts", + Handler: _ProductService_QueryAllBlogPosts_Handler, + }, { MethodName: "QueryAllNullableFieldsTypes", Handler: _ProductService_QueryAllNullableFieldsTypes_Handler, @@ -1001,6 +1433,30 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "QueryAllPets", Handler: _ProductService_QueryAllPets_Handler, }, + { + MethodName: "QueryAuthor", + Handler: _ProductService_QueryAuthor_Handler, + }, + { + MethodName: "QueryAuthorById", + Handler: _ProductService_QueryAuthorById_Handler, + }, + { + MethodName: "QueryAuthorsWithFilter", + Handler: _ProductService_QueryAuthorsWithFilter_Handler, + }, + { + MethodName: "QueryBlogPost", + Handler: _ProductService_QueryBlogPost_Handler, + }, + { + MethodName: "QueryBlogPostById", + Handler: _ProductService_QueryBlogPostById_Handler, + }, + { + MethodName: "QueryBlogPostsWithFilter", + Handler: _ProductService_QueryBlogPostsWithFilter_Handler, + }, { MethodName: "QueryCalculateTotals", Handler: _ProductService_QueryCalculateTotals_Handler, diff --git a/v2/pkg/grpctest/testdata/products.graphqls b/v2/pkg/grpctest/testdata/products.graphqls index 328ae2eddb..a9244f1040 100644 --- a/v2/pkg/grpctest/testdata/products.graphqls +++ b/v2/pkg/grpctest/testdata/products.graphqls @@ -176,6 +176,85 @@ type NullableFieldsType { requiredInt: Int! } +# Blog Post with various list types for testing +type BlogPost { + id: ID! + title: String! + content: String! + + # Single lists with different nullability + tags: [String!]! # Required list, required items + optionalTags: [String!] # Optional list, required items + categories: [String]! # Required list, optional items + keywords: [String] # Optional list, optional items + + # Single lists with different scalar types + viewCounts: [Int!]! # Daily view counts + ratings: [Float] # User ratings (can be null) + isPublished: [Boolean!] # Publication status history + + # Nested lists (one level deep) with different nullability + tagGroups: [[String!]!]! # Required groups, required group content, required tags + relatedTopics: [[String!]]! # Required groups, optional group content, required topics + commentThreads: [[String]!]! # Required threads, required thread content, optional comments + suggestions: [[String]] # Optional groups, optional group content, optional suggestions +} + +# Author with team structure +type Author { + id: ID! + name: String! + email: String + + # Single lists + skills: [String!]! # Required skills + languages: [String]! # Required list, optional languages + socialLinks: [String] # Optional social media links + + # Nested lists for team organization + teamsByProject: [[String!]!]! # Projects -> team members (all required) + collaborations: [[String]] # Past collaborations grouped (all optional) +} + +# Input types +input BlogPostInput { + title: String! + content: String! + tags: [String!]! + optionalTags: [String!] + categories: [String]! + keywords: [String] + viewCounts: [Int!]! + ratings: [Float] + isPublished: [Boolean!] + tagGroups: [[String!]!]! + relatedTopics: [[String!]]! + commentThreads: [[String]!]! + suggestions: [[String]] +} + +input AuthorInput { + name: String! + email: String + skills: [String!]! + languages: [String]! + socialLinks: [String] + teamsByProject: [[String!]!]! + collaborations: [[String]] +} + +input BlogPostFilter { + title: String + hasCategories: Boolean + minTags: Int +} + +input AuthorFilter { + name: String + hasTeams: Boolean + skillCount: Int +} + input NullableFieldsInput { name: String! optionalString: String @@ -192,6 +271,11 @@ input NullableFieldsFilter { includeNulls: Boolean } +input CategoryInput { + name: String! + kind: CategoryKind! +} + type Query { _entities(representations: [_Any!]!): [_Entity!]! users: [User!]! @@ -225,6 +309,18 @@ type Query { nullableFieldsTypeById(id: ID!): NullableFieldsType nullableFieldsTypeWithFilter(filter: NullableFieldsFilter!): [NullableFieldsType!]! allNullableFieldsTypes: [NullableFieldsType!]! + + # Blog post queries (testing single and nested lists) + blogPost: BlogPost! + blogPostById(id: ID!): BlogPost + blogPostsWithFilter(filter: BlogPostFilter!): [BlogPost!]! + allBlogPosts: [BlogPost!]! + + # Author queries (testing team structures) + author: Author! + authorById(id: ID!): Author + authorsWithFilter(filter: AuthorFilter!): [Author!]! + allAuthors: [Author!]! } input UserInput { @@ -240,6 +336,14 @@ type Mutation { # Nullable fields mutation createNullableFieldsType(input: NullableFieldsInput!): NullableFieldsType! updateNullableFieldsType(id: ID!, input: NullableFieldsInput!): NullableFieldsType + + # Blog post mutations (testing single and nested lists) + createBlogPost(input: BlogPostInput!): BlogPost! + updateBlogPost(id: ID!, input: BlogPostInput!): BlogPost + + # Author mutations (testing team structures) + createAuthor(input: AuthorInput!): Author! + updateAuthor(id: ID!, input: AuthorInput!): Author } union _Entity = Product | Storage From 4d3e865dc160301077b063878581cd3888968337 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Tue, 22 Jul 2025 17:03:38 +0200 Subject: [PATCH 03/16] feat: add nested list handling to compiler and json resolve logic --- .../datasource/grpc_datasource/compiler.go | 119 +- .../grpc_datasource/compiler_test.go | 158 +- .../grpc_datasource/execution_plan.go | 15 +- .../execution_plan_list_test.go | 903 +++++- .../grpc_datasource/execution_plan_test.go | 25 +- .../grpc_datasource/execution_plan_visitor.go | 192 +- .../grpc_datasource/grpc_datasource.go | 4 +- .../grpc_datasource/grpc_datasource_test.go | 58 +- .../grpc_datasource/mapping_test_helper.go | 57 + v2/pkg/grpctest/mapping/mapping.go | 57 + v2/pkg/grpctest/mockservice.go | 529 +++- v2/pkg/grpctest/product.proto | 81 + v2/pkg/grpctest/productv1/product.pb.go | 2533 +++++++++++------ v2/pkg/grpctest/testdata/products.graphqls | 31 + 14 files changed, 3675 insertions(+), 1087 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index 7401698d8c..1ac90fc467 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -446,11 +446,38 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes if field.MessageRef >= 0 { var fieldMsg *dynamicpb.Message - // If the field is optional, we are handling a scalar value that is wrapped in a message - // as protobuf scalar types are not nullable. - if rpcField.Optional { - // If we don't have a value for an optional field, we skip it to provide a null message. + switch { + case rpcField.IsListType: + // nested and nullable lists are wrapped in a message, therefore we need to handle them differently + // than repeated fields. + + // if !data.Get(rpcField.JSONPath).Exists() { + // if rpcField.Optional { + // continue + // } + // } + + if rpcField.Optional { + if !data.Get(rpcField.JSONPath).Exists() { + continue + } + } + + if rpcField.ListMetadata == nil { + p.report.AddInternalError(fmt.Errorf("list metadata not found for field %s", rpcField.JSONPath)) + continue + } + + fieldMsg = p.buildListMessage(inputMessage.Desc, field, rpcField, data) + if fieldMsg == nil { + continue + } + case rpcField.IsOptionalScalar(): + // If the field is optional, we are handling a scalar value that is wrapped in a message + // as protobuf scalar types are not nullable. + if !data.Get(rpcField.JSONPath).Exists() { + // If we don't have a value for an optional field, we skip it to provide a null message. continue } @@ -460,7 +487,7 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes rpcField.ToOptionalTypeMessage(p.doc.Messages[field.MessageRef].Name), data, ) - } else { + default: fieldMsg = p.buildProtoMessage(p.doc.Messages[field.MessageRef], rpcField.Message, data.Get(rpcField.JSONPath)) } @@ -498,6 +525,88 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes return message } +func (p *RPCCompiler) buildListMessage(desc protoref.MessageDescriptor, field Field, rpcField *RPCField, data gjson.Result) *dynamicpb.Message { + rootMsg := dynamicpb.NewMessage(desc.Fields().ByName(protoref.Name(field.Name)).Message()) + p.traverseList(rootMsg, 1, field, rpcField, data.Get(rpcField.JSONPath)) + return rootMsg +} + +func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Field, rpcField *RPCField, data gjson.Result) protoref.Message { + fd := rootMsg.Descriptor() + + if level >= rpcField.ListMetadata.NestingLevel { + arr := data.Array() + // TODO handle optional lists + if len(arr) == 0 { + if rpcField.ListMetadata.LevelInfo[level-1].Optional { + return nil + } + + return rootMsg + } + + // List wrappers always use field number 1 + fieldDesc := fd.Fields().ByNumber(1) + if fieldDesc == nil { + p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, rootMsg.Descriptor().Name())) + return nil + } + + itemsField := rootMsg.Mutable(fieldDesc).List() + + switch { + case rpcField.Message != nil: + for _, element := range arr { + msg := p.buildProtoMessage(p.doc.Messages[field.MessageRef], rpcField.Message, element) + itemsField.Append(protoref.ValueOfMessage(msg)) + } + default: + for _, element := range arr { + itemsField.Append(p.setValueForKind(DataType(fieldDesc.Kind().String()), element)) + } + } + + rootMsg.Set(fieldDesc, protoref.ValueOfList(itemsField)) + return rootMsg + } + + // We always expect a list fields in the root message. + listFieldDesc := fd.Fields().ByNumber(1) + if listFieldDesc == nil { + p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, rootMsg.Descriptor().Name())) + return nil + } + + elements := data.Array() + newListField := rootMsg.NewField(listFieldDesc) + if len(elements) == 0 { + if rpcField.ListMetadata.LevelInfo[level-1].Optional { + return nil + } + + rootMsg.Set(listFieldDesc, newListField) + return rootMsg + } + + itemsFieldMsg := newListField.Message() + itemsFieldDesc := itemsFieldMsg.Descriptor().Fields().ByNumber(1) + if itemsFieldDesc == nil { + p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, itemsFieldMsg.Descriptor().Name())) + return nil + } + + itemsField := itemsFieldMsg.Mutable(itemsFieldDesc) + for _, element := range elements { + newElement := itemsField.List().NewElement() + val := p.traverseList(newElement.Message(), level+1, field, rpcField, element) + itemsField.List().Append(protoref.ValueOfMessage(val)) + } + + rootMsg.Set(listFieldDesc, newListField) + + return rootMsg +} + // setValueForKind converts a gjson.Result value to the appropriate protobuf value // based on its kind/type. func (p *RPCCompiler) setValueForKind(kind DataType, data gjson.Result) protoref.Value { diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go b/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go index b35be50399..8a6ab9daaf 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/gjson" "github.com/wundergraph/graphql-go-tools/v2/pkg/grpctest" + "google.golang.org/protobuf/reflect/protoreflect" ) // Complete valid protobuf definition with service and message definitions @@ -296,16 +297,153 @@ func TestCompileNestedLists(t *testing.T) { compiler, err := NewProtoCompiler(grpctest.MustProtoSchema(t), testMapping()) require.NoError(t, err) - require.Equal(t, "productv1", compiler.doc.Package) + plan := &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryCalculateTotals", + Request: RPCMessage{ + Name: "QueryCalculateTotalsRequest", + Fields: []RPCField{ + { + Name: "orders", + TypeName: string(DataTypeMessage), + JSONPath: "orders", + Repeated: true, + Message: &RPCMessage{ + Name: "OrderInput", + Fields: []RPCField{ + { + Name: "order_id", + TypeName: string(DataTypeString), + JSONPath: "orderId", + }, + { + Name: "customer_name", + TypeName: string(DataTypeString), + JSONPath: "customerName", + }, + { + Name: "lines", + TypeName: string(DataTypeMessage), + JSONPath: "lines", + Repeated: true, + Message: &RPCMessage{ + Name: "OrderLineInput", + Fields: []RPCField{ + { + Name: "product_id", + TypeName: string(DataTypeString), + JSONPath: "productId", + }, + { + Name: "quantity", + TypeName: string(DataTypeInt32), + JSONPath: "quantity", + }, + { + Name: "modifiers", + TypeName: string(DataTypeString), + JSONPath: "modifiers", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "QueryCalculateTotalsResponse", + Fields: []RPCField{ + { + Name: "calculate_totals", + TypeName: string(DataTypeMessage), + JSONPath: "calculateTotals", + Repeated: true, + Message: &RPCMessage{ + Name: "Order", + Fields: []RPCField{ + { + Name: "order_id", + TypeName: string(DataTypeString), + JSONPath: "orderId", + }, + { + Name: "customer_name", + TypeName: string(DataTypeString), + JSONPath: "customerName", + }, + { + Name: "total_items", + TypeName: string(DataTypeInt32), + JSONPath: "totalItems", + }, + }, + }, + }, + }, + }, + }, + }, + } + + invocations, err := compiler.Compile(plan, gjson.ParseBytes([]byte(`{"orders":[{"orderId":"123","customerName":"John Doe","lines":[{"productId":"123","quantity":1, "modifiers":["modifier1", "modifier2"]}]}]}`))) + require.NoError(t, err) + require.Equal(t, 1, len(invocations)) + + proto := invocations[0].Input.ProtoReflect() + + msgDesc := proto.Descriptor() + + ordersDesc := msgDesc.Fields().ByName("orders") + require.True(t, proto.Has(ordersDesc)) + orders := proto.Get(ordersDesc) + require.True(t, orders.IsValid()) - listOfListOfString := compiler.doc.MessageByName("ListOfListOfString") - require.Equal(t, "ListOfListOfString", listOfListOfString.Name) - require.Equal(t, 1, len(listOfListOfString.Fields)) - require.Equal(t, "list", listOfListOfString.Fields[0].Name) + require.True(t, ordersDesc.IsList()) + ordersList := orders.List() - message := compiler.doc.MessageByName("BlogPost") - require.Equal(t, "BlogPost", message.Name) - require.Equal(t, 2, len(message.Fields)) - require.Equal(t, "id", message.Fields[0].Name) - require.Equal(t, "tag_groups", message.Fields[1].Name) + orderMsg := ordersList.Get(0).Message() + orderDesc := orderMsg.Descriptor() + require.True(t, ordersList.Get(0).Message().Has(orderDesc.Fields().ByName("order_id"))) + require.True(t, ordersList.Get(0).Message().Has(orderDesc.Fields().ByName("customer_name"))) + require.True(t, ordersList.Get(0).Message().Has(orderDesc.Fields().ByName("lines"))) + + linesList := ordersList.Get(0).Message().Get(orderDesc.Fields().ByName("lines")).List() + require.True(t, linesList.IsValid()) + + require.Equal(t, 1, linesList.Len()) + + for i := 0; i < linesList.Len(); i++ { + linesMsg := linesList.Get(i).Message() + + linesDesc := linesMsg.Descriptor().Fields() + + require.True(t, linesMsg.Has(linesDesc.ByName("product_id"))) + require.True(t, linesMsg.Has(linesDesc.ByName("quantity"))) + require.True(t, linesMsg.Has(linesDesc.ByName("modifiers"))) + + modifiersDesc := linesDesc.ByName("modifiers") + require.True(t, modifiersDesc.Kind() == protoreflect.MessageKind) + + modifiersMsg := linesMsg.Get(modifiersDesc).Message() + require.True(t, modifiersMsg.IsValid(), "expected modifiers message to be valid") + modifiersList := modifiersMsg.Get(modifiersMsg.Descriptor().Fields().ByName("items")).List() + require.True(t, modifiersList.IsValid(), "expected modifiers list to be valid") + require.Equal(t, 2, modifiersList.Len()) + require.Equal(t, "modifier1", modifiersList.Get(0).String()) + require.Equal(t, "modifier2", modifiersList.Get(1).String()) + } } diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go index ef89c30ff7..c0fd5f6042 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go @@ -180,13 +180,17 @@ type RPCField struct { Message *RPCMessage } +// ListMetadata contains the metadata for the list type type ListMetadata struct { - ItemTypeName string + // NestingLevel is the nesting level of the list type NestingLevel int - LevelInfo []ListMetadataItem + // LevelInfo contains the metadata for each nesting level of the list + LevelInfo []LevelInfo } -type ListMetadataItem struct { +// LevelInfo contains the metadata for the list type +type LevelInfo struct { + // Optional indicates if the field is optional Optional bool } @@ -221,6 +225,11 @@ func (r *RPCField) AliasOrPath() string { return r.JSONPath } +// IsOptionalScalar checks if the field is an optional scalar value. +func (r *RPCField) IsOptionalScalar() bool { + return r.Optional && r.Message == nil +} + // RPCFields is a list of RPCFields that provides helper methods // for working with collections of fields. type RPCFields []RPCField diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go index 7e85f04c8e..e85e58d6c9 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_list_test.go @@ -77,17 +77,16 @@ func TestListExecutionPlan(t *testing.T) { JSONPath: "title", }, { - Name: "optional_tags", - TypeName: string(DataTypeMessage), - Optional: true, - Message: &RPCMessage{ - Name: "ListOfString", - Fields: RPCFields{ + Name: "optional_tags", + TypeName: string(DataTypeString), + Optional: true, + JSONPath: "optionalTags", + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ { - Name: "items", - TypeName: string(DataTypeString), - Repeated: true, - JSONPath: "optionalTags", + Optional: true, }, }, }, @@ -123,37 +122,167 @@ func TestListExecutionPlan(t *testing.T) { Name: "BlogPost", Fields: RPCFields{ { - Name: "tag_groups", + Name: "tag_groups", + TypeName: string(DataTypeString), + Repeated: false, + JSONPath: "tagGroups", + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: false, + }, + { + Optional: false, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + runTest(t, testCase{ + query: tt.query, + expectedPlan: tt.expectedPlan, + expectedError: tt.expectedError, + }) + }) + } +} + +func TestListParametersExecutionPlan(t *testing.T) { + tests := []struct { + name string + query string + expectedPlan *RPCExecutionPlan + expectedError string + }{ + { + name: "Should create an execution plan for query with required list of required enums parameter", + query: `query GetCategoriesByKinds($kinds: [CategoryKind!]!) { categoriesByKinds(kinds: $kinds) { id name kind } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryCategoriesByKinds", + Request: RPCMessage{ + Name: "QueryCategoriesByKindsRequest", + Fields: []RPCField{ + { + Name: "kinds", + TypeName: string(DataTypeEnum), + JSONPath: "kinds", + EnumName: "CategoryKind", + Repeated: true, + }, + }, + }, + Response: RPCMessage{ + Name: "QueryCategoriesByKindsResponse", + Fields: []RPCField{ + { + Name: "categories_by_kinds", + TypeName: string(DataTypeMessage), + JSONPath: "categoriesByKinds", + Repeated: true, + Message: &RPCMessage{ + Name: "Category", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for query with required list of required input objects parameter", + query: `query CalculateTotals($orders: [OrderInput!]!) { calculateTotals(orders: $orders) { orderId customerName totalItems } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryCalculateTotals", + Request: RPCMessage{ + Name: "QueryCalculateTotalsRequest", + Fields: []RPCField{ + { + Name: "orders", + TypeName: string(DataTypeMessage), + JSONPath: "orders", + Repeated: true, + Message: &RPCMessage{ + Name: "OrderInput", + Fields: []RPCField{ + { + Name: "order_id", + TypeName: string(DataTypeString), + JSONPath: "orderId", + }, + { + Name: "customer_name", + TypeName: string(DataTypeString), + JSONPath: "customerName", + }, + { + Name: "lines", TypeName: string(DataTypeMessage), - Repeated: false, - JSONPath: "", + JSONPath: "lines", + Repeated: true, Message: &RPCMessage{ - Name: "ListOfListOfString", - Fields: RPCFields{ - { - Name: "list", - TypeName: string(DataTypeMessage), - Repeated: false, - JSONPath: "", - Message: &RPCMessage{ - Name: "List", - Fields: RPCFields{ + Name: "OrderLineInput", + Fields: []RPCField{ + { + Name: "product_id", + TypeName: string(DataTypeString), + JSONPath: "productId", + }, + { + Name: "quantity", + TypeName: string(DataTypeInt32), + JSONPath: "quantity", + }, + { + Name: "modifiers", + TypeName: string(DataTypeString), + JSONPath: "modifiers", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ { - Name: "items", - TypeName: string(DataTypeMessage), - Repeated: true, - JSONPath: "", - Message: &RPCMessage{ - Name: "ListOfString", - Fields: RPCFields{ - { - Name: "items", - TypeName: string(DataTypeString), - Repeated: true, - JSONPath: "tagGroups", - }, - }, - }, + Optional: true, }, }, }, @@ -166,6 +295,704 @@ func TestListExecutionPlan(t *testing.T) { }, }, }, + Response: RPCMessage{ + Name: "QueryCalculateTotalsResponse", + Fields: []RPCField{ + { + Name: "calculate_totals", + TypeName: string(DataTypeMessage), + JSONPath: "calculateTotals", + Repeated: true, + Message: &RPCMessage{ + Name: "Order", + Fields: []RPCField{ + { + Name: "order_id", + TypeName: string(DataTypeString), + JSONPath: "orderId", + }, + { + Name: "customer_name", + TypeName: string(DataTypeString), + JSONPath: "customerName", + }, + { + Name: "total_items", + TypeName: string(DataTypeInt32), + JSONPath: "totalItems", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for BlogPost mutation with single list parameters", + query: `mutation CreateBlogPost($input: BlogPostInput!) { createBlogPost(input: $input) { id title tags optionalTags categories keywords } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "MutationCreateBlogPost", + Request: RPCMessage{ + Name: "MutationCreateBlogPostRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "BlogPostInput", + Fields: []RPCField{ + { + Name: "title", + TypeName: string(DataTypeString), + JSONPath: "title", + }, + { + Name: "content", + TypeName: string(DataTypeString), + JSONPath: "content", + }, + { + Name: "tags", + TypeName: string(DataTypeString), + JSONPath: "tags", + Repeated: true, + }, + { + Name: "optional_tags", + TypeName: string(DataTypeString), + JSONPath: "optionalTags", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + { + Name: "categories", + TypeName: string(DataTypeString), + JSONPath: "categories", + Repeated: true, + }, + { + Name: "keywords", + TypeName: string(DataTypeString), + JSONPath: "keywords", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + { + Name: "view_counts", + TypeName: string(DataTypeInt32), + JSONPath: "viewCounts", + Repeated: true, + }, + { + Name: "ratings", + TypeName: string(DataTypeDouble), + JSONPath: "ratings", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + { + Name: "is_published", + TypeName: string(DataTypeBool), + JSONPath: "isPublished", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + { + Name: "tag_groups", + TypeName: string(DataTypeString), + JSONPath: "tagGroups", + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: false, + }, + { + Optional: false, + }, + }, + }, + }, + { + Name: "related_topics", + TypeName: string(DataTypeString), + JSONPath: "relatedTopics", + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: false, + }, + { + Optional: true, + }, + }, + }, + }, + { + Name: "comment_threads", + TypeName: string(DataTypeString), + JSONPath: "commentThreads", + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: false, + }, + { + Optional: false, + }, + }, + }, + }, + { + Name: "suggestions", + TypeName: string(DataTypeString), + JSONPath: "suggestions", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + { + Optional: true, + }, + }, + }, + }, + { + Name: "related_categories", + TypeName: string(DataTypeMessage), + JSONPath: "relatedCategories", + Repeated: false, + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + Message: &RPCMessage{ + Name: "CategoryInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", + }, + }, + }, + }, + { + Name: "contributors", + TypeName: string(DataTypeMessage), + JSONPath: "contributors", + Repeated: false, + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + Message: &RPCMessage{ + Name: "UserInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + }, + }, + }, + { + Name: "category_groups", + TypeName: string(DataTypeMessage), + JSONPath: "categoryGroups", + Repeated: false, + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + { + Optional: true, + }, + }, + }, + Message: &RPCMessage{ + Name: "CategoryInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", + }, + }, + }, + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "MutationCreateBlogPostResponse", + Fields: []RPCField{ + { + Name: "create_blog_post", + TypeName: string(DataTypeMessage), + JSONPath: "createBlogPost", + Message: &RPCMessage{ + Name: "BlogPost", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "title", + TypeName: string(DataTypeString), + JSONPath: "title", + }, + { + Name: "tags", + TypeName: string(DataTypeString), + JSONPath: "tags", + Repeated: true, + }, + { + Name: "optional_tags", + TypeName: string(DataTypeString), + JSONPath: "optionalTags", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + { + Name: "categories", + TypeName: string(DataTypeString), + JSONPath: "categories", + Repeated: true, + }, + { + Name: "keywords", + TypeName: string(DataTypeString), + JSONPath: "keywords", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for Author mutation with nested list parameters", + query: `mutation CreateAuthor($input: AuthorInput!) { createAuthor(input: $input) { id name skills teamsByProject collaborations } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "MutationCreateAuthor", + Request: RPCMessage{ + Name: "MutationCreateAuthorRequest", + Fields: []RPCField{ + { + Name: "input", + TypeName: string(DataTypeMessage), + JSONPath: "input", + Message: &RPCMessage{ + Name: "AuthorInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "email", + TypeName: string(DataTypeString), + JSONPath: "email", + Optional: true, + }, + { + Name: "skills", + TypeName: string(DataTypeString), + JSONPath: "skills", + Repeated: true, + }, + { + Name: "languages", + TypeName: string(DataTypeString), + JSONPath: "languages", + Repeated: true, + }, + { + Name: "social_links", + TypeName: string(DataTypeString), + JSONPath: "socialLinks", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + }, + }, + }, + { + Name: "teams_by_project", + TypeName: string(DataTypeString), + JSONPath: "teamsByProject", + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: false, + }, + { + Optional: false, + }, + }, + }, + }, + { + Name: "collaborations", + TypeName: string(DataTypeString), + JSONPath: "collaborations", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + { + Optional: true, + }, + }, + }, + }, + { + Name: "favorite_categories", + TypeName: string(DataTypeMessage), + JSONPath: "favoriteCategories", + Repeated: true, + Message: &RPCMessage{ + Name: "CategoryInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "kind", + TypeName: string(DataTypeEnum), + JSONPath: "kind", + EnumName: "CategoryKind", + }, + }, + }, + }, + { + Name: "author_groups", + TypeName: string(DataTypeMessage), + JSONPath: "authorGroups", + Repeated: false, + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + { + Optional: true, + }, + }, + }, + Message: &RPCMessage{ + Name: "UserInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + }, + }, + }, + { + Name: "project_teams", + TypeName: string(DataTypeMessage), + JSONPath: "projectTeams", + Repeated: false, + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + { + Optional: true, + }, + }, + }, + Message: &RPCMessage{ + Name: "UserInput", + Fields: []RPCField{ + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + }, + }, + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "MutationCreateAuthorResponse", + Fields: []RPCField{ + { + Name: "create_author", + TypeName: string(DataTypeMessage), + JSONPath: "createAuthor", + Message: &RPCMessage{ + Name: "Author", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "name", + TypeName: string(DataTypeString), + JSONPath: "name", + }, + { + Name: "skills", + TypeName: string(DataTypeString), + JSONPath: "skills", + Repeated: true, + }, + { + Name: "teams_by_project", + TypeName: string(DataTypeString), + JSONPath: "teamsByProject", + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: false, + }, + { + Optional: false, + }, + }, + }, + }, + { + Name: "collaborations", + TypeName: string(DataTypeString), + JSONPath: "collaborations", + Optional: true, + IsListType: true, + ListMetadata: &ListMetadata{ + NestingLevel: 2, + LevelInfo: []LevelInfo{ + { + Optional: true, + }, + { + Optional: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Should create an execution plan for filtered BlogPost query with simple parameters", + query: `query FilteredBlogPosts($filter: BlogPostFilter!) { blogPostsWithFilter(filter: $filter) { id title tags } }`, + expectedPlan: &RPCExecutionPlan{ + Calls: []RPCCall{ + { + ServiceName: "Products", + MethodName: "QueryBlogPostsWithFilter", + Request: RPCMessage{ + Name: "QueryBlogPostsWithFilterRequest", + Fields: []RPCField{ + { + Name: "filter", + TypeName: string(DataTypeMessage), + JSONPath: "filter", + Message: &RPCMessage{ + Name: "BlogPostFilter", + Fields: []RPCField{ + { + Name: "title", + TypeName: string(DataTypeString), + JSONPath: "title", + Optional: true, + }, + { + Name: "has_categories", + TypeName: string(DataTypeBool), + JSONPath: "hasCategories", + Optional: true, + }, + { + Name: "min_tags", + TypeName: string(DataTypeInt32), + JSONPath: "minTags", + Optional: true, + }, + }, + }, + }, + }, + }, + Response: RPCMessage{ + Name: "QueryBlogPostsWithFilterResponse", + Fields: []RPCField{ + { + Name: "blog_posts_with_filter", + TypeName: string(DataTypeMessage), + JSONPath: "blogPostsWithFilter", + Repeated: true, + Message: &RPCMessage{ + Name: "BlogPost", + Fields: []RPCField{ + { + Name: "id", + TypeName: string(DataTypeString), + JSONPath: "id", + }, + { + Name: "title", + TypeName: string(DataTypeString), + JSONPath: "title", + }, + { + Name: "tags", + TypeName: string(DataTypeString), + JSONPath: "tags", + Repeated: true, + }, + }, + }, + }, + }, + }, }, }, }, diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go index d9837e0b12..a104ac585f 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_test.go @@ -303,6 +303,7 @@ func TestQueryExecutionPlans(t *testing.T) { Name: "pagination", TypeName: string(DataTypeMessage), JSONPath: "pagination", + Optional: true, Message: &RPCMessage{ Name: "Pagination", Fields: []RPCField{ @@ -401,6 +402,7 @@ func TestQueryExecutionPlans(t *testing.T) { Name: "pagination", TypeName: string(DataTypeMessage), JSONPath: "pagination", + Optional: true, Message: &RPCMessage{ Name: "Pagination", Fields: []RPCField{ @@ -500,6 +502,7 @@ func TestQueryExecutionPlans(t *testing.T) { Name: "pagination", TypeName: string(DataTypeMessage), JSONPath: "pagination", + Optional: true, Message: &RPCMessage{ Name: "Pagination", Fields: []RPCField{ @@ -1013,18 +1016,17 @@ func TestQueryExecutionPlans(t *testing.T) { JSONPath: "quantity", }, { - Name: "modifiers", - TypeName: string(DataTypeMessage), - Repeated: false, - Optional: true, - Message: &RPCMessage{ - Name: "ListOfString", - Fields: []RPCField{ + Name: "modifiers", + TypeName: string(DataTypeString), + Repeated: false, + Optional: true, + IsListType: true, + JSONPath: "modifiers", + ListMetadata: &ListMetadata{ + NestingLevel: 1, + LevelInfo: []LevelInfo{ { - Name: "items", - TypeName: string(DataTypeString), - Repeated: true, - JSONPath: "modifiers", + Optional: true, }, }, }, @@ -1255,6 +1257,7 @@ func TestProductExecutionPlan(t *testing.T) { Name: "pagination", TypeName: string(DataTypeMessage), JSONPath: "pagination", + Optional: true, Message: &RPCMessage{ Name: "Pagination", Fields: []RPCField{ diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go index 560eee8b08..5de85540a8 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go @@ -359,13 +359,11 @@ func (r *rpcPlanVisitor) buildField(fd int, fieldName, fieldAlias string) RPCFie // for nullable or nested lists we need to build a wrapper message // Nullability is handled by the datasource during the execution. case r.typeIsNullableOrNestedList(fdt): - field.ListMetadata = r.createListMetadata(fdt, r.definition.ResolveTypeNameString(fdt)) - field.TypeName = DataTypeMessage.String() + field.ListMetadata = r.createListMetadata(fdt) field.IsListType = true default: // For non-nullable single lists we can directly use the repeated syntax in protobuf. field.Repeated = true - field.TypeName = typeName.String() } } @@ -483,9 +481,7 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i // For nullable or nested lists we need to build a wrapper message if r.typeIsNullableOrNestedList(typeRef) { - field.JSONPath = "" - field.Message = r.buildListMessage(typeRef, baseType, fieldName) - field.TypeName = DataTypeMessage.String() + field.ListMetadata = r.createListMetadata(typeRef) field.Repeated = false field.IsListType = true } @@ -503,98 +499,6 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i } } -func (r *rpcPlanVisitor) typeIsNonNullList(typeRef int) bool { - return r.definition.TypeIsList(typeRef) && r.definition.TypeIsNonNull(typeRef) -} - -func (r *rpcPlanVisitor) createListMetadata(typeRef int, graphqlTypeName string) *ListMetadata { - nestingLevel := r.definition.TypeNumberOfListWraps(typeRef) - - md := &ListMetadata{ - ItemTypeName: graphqlTypeName, - NestingLevel: nestingLevel, - LevelInfo: make([]ListMetadataItem, nestingLevel), - } - - for i := 0; i < nestingLevel; i++ { - md.LevelInfo[i] = ListMetadataItem{ - Optional: !r.definition.TypeIsNonNull(typeRef), - } - - typeRef = r.unwrapListNesting(typeRef) - } - - return md -} - -func (r *rpcPlanVisitor) buildListMessage(typeRef int, graphqlTypeName, jsonPath string) *RPCMessage { - nestingLevel := r.definition.TypeNumberOfListWraps(typeRef) - - dataType := r.toDataType(&r.definition.Types[typeRef]) - - rootMessage := &RPCMessage{} - currentMessage := rootMessage - for i := nestingLevel; i > 0; i-- { - // Add the prefix to the name of the current message. - currentMessage.Name = strings.Repeat(knownListWrapperPrefix, i) + graphqlTypeName - if i == 1 { - currentMessage.Fields = RPCFields{ - { - Name: "items", - TypeName: dataType.String(), - Repeated: true, - JSONPath: jsonPath, - }, - } - break - } - - // for nested lists we need to create a new message for each level. - nextMessage := &RPCMessage{} - currentMessage.Fields = RPCFields{ - { - Name: "list", - TypeName: DataTypeMessage.String(), - Message: &RPCMessage{ - Name: "List", - Fields: RPCFields{ - { - Name: "items", - Repeated: true, - TypeName: DataTypeMessage.String(), - Optional: !r.definition.TypeIsNonNull(typeRef), - Message: nextMessage, - }, - }, - }, - }, - } - - // Set the current message to the next message. - currentMessage = nextMessage - // Unwrap the list nesting. - typeRef = r.unwrapListNesting(typeRef) - } - - return rootMessage -} - -func (r *rpcPlanVisitor) unwrapListNesting(typeRef int) int { - if !r.definition.TypeIsList(typeRef) { - return typeRef - } - - if r.definition.TypeIsNonNull(typeRef) { - typeRef = r.definition.Types[typeRef].OfType - } - - if r.definition.Types[typeRef].TypeKind == ast.TypeKindList { - typeRef = r.definition.Types[typeRef].OfType - } - - return typeRef -} - // buildMessageFromNode builds a message structure from an AST node. func (r *rpcPlanVisitor) buildMessageFromNode(node ast.Node) { switch node.Kind { @@ -620,27 +524,13 @@ func (r *rpcPlanVisitor) buildMessageField(fieldName string, typeRef, parentType } parentTypeName := r.definition.InputObjectTypeDefinitionNameString(parentTypeRef) + mappedName := r.resolveFieldMapping(parentTypeName, fieldName) // If the type is not an object, directly add the field to the request message // TODO: check interfaces, unions, etc. if underlyingTypeNode.Kind != ast.NodeKindInputObjectTypeDefinition { - dt := r.toDataType(&inputValueDefinitionType) - field := RPCField{ - Name: r.resolveFieldMapping(parentTypeName, fieldName), - Repeated: r.typeIsNonNullList(typeRef), - Optional: !r.definition.TypeIsNonNull(typeRef), - TypeName: dt.String(), - JSONPath: fieldName, - } - - if r.typeIsNullableOrNestedList(typeRef) { - field.JSONPath = "" - field.Message = r.buildListMessage(typeRef, underlyingTypeName, fieldName) - field.TypeName = DataTypeMessage.String() - field.Repeated = false - field.IsListType = true - } + field := r.buildInputMessageField(typeRef, mappedName, fieldName, dt) if dt == DataTypeEnum { field.EnumName = underlyingTypeName @@ -655,15 +545,10 @@ func (r *rpcPlanVisitor) buildMessageField(fieldName string, typeRef, parentType Name: underlyingTypeName, } - // TODO in case of a list make sure the message ancestor is the last message in the list + field := r.buildInputMessageField(typeRef, mappedName, fieldName, DataTypeMessage) + field.Message = msg - r.planInfo.currentRequestMessage.Fields = append(r.planInfo.currentRequestMessage.Fields, RPCField{ - Name: r.resolveFieldMapping(parentTypeName, fieldName), - TypeName: DataTypeMessage.String(), - JSONPath: fieldName, - Message: msg, - Repeated: r.definition.TypeIsList(typeRef), - }) + r.planInfo.currentRequestMessage.Fields = append(r.planInfo.currentRequestMessage.Fields, field) r.planInfo.requestMessageAncestors = append(r.planInfo.requestMessageAncestors, r.planInfo.currentRequestMessage) r.planInfo.currentRequestMessage = msg @@ -674,6 +559,69 @@ func (r *rpcPlanVisitor) buildMessageField(fieldName string, typeRef, parentType r.planInfo.requestMessageAncestors = r.planInfo.requestMessageAncestors[:len(r.planInfo.requestMessageAncestors)-1] } +func (r *rpcPlanVisitor) buildInputMessageField(typeRef int, fieldName, jsonPath string, dt DataType) RPCField { + field := RPCField{ + Name: fieldName, + Optional: !r.definition.TypeIsNonNull(typeRef), + TypeName: dt.String(), + JSONPath: jsonPath, + } + + if r.definition.TypeIsList(typeRef) { + switch { + // for nullable or nested lists we need to build a wrapper message + // Nullability is handled by the datasource during the execution. + case r.typeIsNullableOrNestedList(typeRef): + field.ListMetadata = r.createListMetadata(typeRef) + field.IsListType = true + default: + // For non-nullable single lists we can directly use the repeated syntax in protobuf. + field.Repeated = true + } + } + + return field +} + +func (r *rpcPlanVisitor) typeIsNonNullList(typeRef int) bool { + return r.definition.TypeIsList(typeRef) && r.definition.TypeIsNonNull(typeRef) +} + +func (r *rpcPlanVisitor) createListMetadata(typeRef int) *ListMetadata { + nestingLevel := r.definition.TypeNumberOfListWraps(typeRef) + + md := &ListMetadata{ + NestingLevel: nestingLevel, + LevelInfo: make([]LevelInfo, nestingLevel), + } + + for i := 0; i < nestingLevel; i++ { + md.LevelInfo[i] = LevelInfo{ + Optional: !r.definition.TypeIsNonNull(typeRef), + } + + typeRef = r.unwrapListNesting(typeRef) + } + + return md +} + +func (r *rpcPlanVisitor) unwrapListNesting(typeRef int) int { + if !r.definition.TypeIsList(typeRef) { + return typeRef + } + + if r.definition.TypeIsNonNull(typeRef) { + typeRef = r.definition.Types[typeRef].OfType + } + + if r.definition.Types[typeRef].TypeKind == ast.TypeKindList { + typeRef = r.definition.Types[typeRef].OfType + } + + return typeRef +} + func (r *rpcPlanVisitor) resolveEntityInformation(inlineFragmentRef int) { // TODO support multiple entities in a single query if !r.planInfo.isEntityLookup || r.planInfo.entityInfo.name != "" { diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go index 06636bbfa3..352b0dcd8c 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go @@ -232,7 +232,7 @@ func (d *DataSource) marshalResponseJSON(arena *astjson.Arena, message *RPCMessa continue } - if field.Optional { + if field.IsOptionalScalar() { err := d.resolveOptionalField(arena, root, field.JSONPath, msg) if err != nil { return nil, err @@ -307,7 +307,7 @@ func (d *DataSource) traverseList(level int, arena *astjson.Arena, current *astj return arena.NewNull(), nil } - return arena.NewNull(), fmt.Errorf("unable to flatten list structure: message %q is invalid", data.Descriptor().Name()) + return arena.NewArray(), nil } fd = msg.Descriptor().Fields().ByNumber(1) diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go index 67fc18c3db..2cfa0b0bf9 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go @@ -2319,8 +2319,8 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { }, { name: "Should handle BlogPost query by ID", - query: `query { - blogPostById(id: "test-blog-1") { + query: `query($id: ID!) { + blogPostById(id: $id) { id title content @@ -2328,7 +2328,7 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { tagGroups } }`, - vars: "{}", + vars: `{"variables":{"id":"test-blog-1"}}`, validate: func(t *testing.T, data map[string]interface{}) { blogPost, ok := data["blogPostById"].(map[string]interface{}) require.True(t, ok, "blogPostById should be an object") @@ -2340,15 +2340,15 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { }, { name: "Should handle Author query by ID", - query: `query { - authorById(id: "test-author-1") { + query: `query($id: ID!) { + authorById(id: $id) { id name skills teamsByProject } }`, - vars: "{}", + vars: `{"variables":{"id":"test-author-1"}}`, validate: func(t *testing.T, data map[string]interface{}) { author, ok := data["authorById"].(map[string]interface{}) require.True(t, ok, "authorById should be an object") @@ -2360,8 +2360,8 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { }, { name: "Should handle BlogPost filtered query", - query: `query { - blogPostsWithFilter(filter: { title: "Test", hasCategories: true, minTags: 2 }) { + query: `query($filter: BlogPostFilter!) { + blogPostsWithFilter(filter: $filter) { id title tags @@ -2369,7 +2369,7 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { tagGroups } }`, - vars: "{}", + vars: `{"variables":{"filter":{"title":"Test","hasCategories":true,"minTags":2}}}`, validate: func(t *testing.T, data map[string]interface{}) { blogPosts, ok := data["blogPostsWithFilter"].([]interface{}) require.True(t, ok, "blogPostsWithFilter should be an array") @@ -2388,15 +2388,15 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { }, { name: "Should handle Author filtered query", - query: `query { - authorsWithFilter(filter: { name: "Test", hasTeams: true, skillCount: 3 }) { + query: `query($filter: AuthorFilter!) { + authorsWithFilter(filter: $filter) { id name skills teamsByProject } }`, - vars: "{}", + vars: `{"variables":{"filter":{"name":"Test","hasTeams":true,"skillCount":3}}}`, validate: func(t *testing.T, data map[string]interface{}) { authors, ok := data["authorsWithFilter"].([]interface{}) require.True(t, ok, "authorsWithFilter should be an array") @@ -2414,22 +2414,8 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { }, { name: "Should handle BlogPost creation mutation", - query: `mutation { - createBlogPost(input: { - title: "New Blog Post" - content: "Content here" - tags: ["tech", "programming"] - optionalTags: ["optional1", "optional2"] - categories: ["Technology", "Programming"] - keywords: ["keyword1", "keyword2"] - viewCounts: [100, 200, 300] - ratings: [4.5, 5.0, 3.8] - isPublished: [true, false, true] - tagGroups: [["tech", "go"], ["programming", "backend"]] - relatedTopics: [["topic1", "topic2"], ["topic3"]] - commentThreads: [["comment1", "comment2"], ["comment3", "comment4"]] - suggestions: [["suggestion1"], ["suggestion2", "suggestion3"]] - }) { + query: `mutation($input: BlogPostInput!) { + createBlogPost(input: $input) { id title content @@ -2439,7 +2425,7 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { relatedTopics } }`, - vars: "{}", + vars: `{"variables":{"input":{"title":"New Blog Post","content":"Content here","tags":["tech","programming"],"optionalTags":["optional1","optional2"],"categories":["Technology","Programming"],"keywords":["keyword1","keyword2"],"viewCounts":[100,200,300],"ratings":[4.5,5.0,3.8],"isPublished":[true,false,true],"tagGroups":[["tech","go"],["programming","backend"]],"relatedTopics":[["topic1","topic2"],["topic3"]],"commentThreads":[["comment1","comment2"],["comment3","comment4"]],"suggestions":[["suggestion1"],["suggestion2","suggestion3"]]}}}`, validate: func(t *testing.T, data map[string]interface{}) { createBlogPost, ok := data["createBlogPost"].(map[string]interface{}) require.True(t, ok, "createBlogPost should be an object") @@ -2470,16 +2456,8 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { }, { name: "Should handle Author creation mutation", - query: `mutation { - createAuthor(input: { - name: "New Author" - email: "author@example.com" - skills: ["Go", "GraphQL", "gRPC"] - languages: ["English", "Spanish"] - socialLinks: ["twitter.com/author", "github.com/author"] - teamsByProject: [["Alice", "Bob"], ["Charlie", "David", "Eve"]] - collaborations: [["Project1", "Project2"], ["Project3"]] - }) { + query: `mutation($input: AuthorInput!) { + createAuthor(input: $input) { id name email @@ -2490,7 +2468,7 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { collaborations } }`, - vars: "{}", + vars: `{"variables":{"input":{"name":"New Author","email":"author@example.com","skills":["Go","GraphQL","gRPC"],"languages":["English","Spanish"],"socialLinks":["twitter.com/author","github.com/author"],"teamsByProject":[["Alice","Bob"],["Charlie","David","Eve"]],"collaborations":[["Project1","Project2"],["Project3"]]}}}`, validate: func(t *testing.T, data map[string]interface{}) { createAuthor, ok := data["createAuthor"].(map[string]interface{}) require.True(t, ok, "createAuthor should be an object") diff --git a/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go b/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go index a5e728d6bf..8f65a97a11 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go +++ b/v2/pkg/engine/datasource/grpc_datasource/mapping_test_helper.go @@ -772,6 +772,24 @@ func testMapping() *GRPCMapping { "suggestions": { TargetName: "suggestions", }, + "relatedCategories": { + TargetName: "related_categories", + }, + "contributors": { + TargetName: "contributors", + }, + "mentionedProducts": { + TargetName: "mentioned_products", + }, + "mentionedUsers": { + TargetName: "mentioned_users", + }, + "categoryGroups": { + TargetName: "category_groups", + }, + "contributorTeams": { + TargetName: "contributor_teams", + }, }, "Author": { "id": { @@ -798,6 +816,27 @@ func testMapping() *GRPCMapping { "collaborations": { TargetName: "collaborations", }, + "writtenPosts": { + TargetName: "written_posts", + }, + "favoriteCategories": { + TargetName: "favorite_categories", + }, + "relatedAuthors": { + TargetName: "related_authors", + }, + "productReviews": { + TargetName: "product_reviews", + }, + "authorGroups": { + TargetName: "author_groups", + }, + "categoryPreferences": { + TargetName: "category_preferences", + }, + "projectTeams": { + TargetName: "project_teams", + }, }, "BlogPostInput": { "title": { @@ -839,6 +878,15 @@ func testMapping() *GRPCMapping { "suggestions": { TargetName: "suggestions", }, + "relatedCategories": { + TargetName: "related_categories", + }, + "contributors": { + TargetName: "contributors", + }, + "categoryGroups": { + TargetName: "category_groups", + }, }, "AuthorInput": { "name": { @@ -862,6 +910,15 @@ func testMapping() *GRPCMapping { "collaborations": { TargetName: "collaborations", }, + "favoriteCategories": { + TargetName: "favorite_categories", + }, + "authorGroups": { + TargetName: "author_groups", + }, + "projectTeams": { + TargetName: "project_teams", + }, }, "BlogPostFilter": { "title": { diff --git a/v2/pkg/grpctest/mapping/mapping.go b/v2/pkg/grpctest/mapping/mapping.go index da6870384c..d9f563780d 100644 --- a/v2/pkg/grpctest/mapping/mapping.go +++ b/v2/pkg/grpctest/mapping/mapping.go @@ -779,6 +779,24 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { "suggestions": { TargetName: "suggestions", }, + "relatedCategories": { + TargetName: "related_categories", + }, + "contributors": { + TargetName: "contributors", + }, + "mentionedProducts": { + TargetName: "mentioned_products", + }, + "mentionedUsers": { + TargetName: "mentioned_users", + }, + "categoryGroups": { + TargetName: "category_groups", + }, + "contributorTeams": { + TargetName: "contributor_teams", + }, }, "Author": { "id": { @@ -805,6 +823,27 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { "collaborations": { TargetName: "collaborations", }, + "writtenPosts": { + TargetName: "written_posts", + }, + "favoriteCategories": { + TargetName: "favorite_categories", + }, + "relatedAuthors": { + TargetName: "related_authors", + }, + "productReviews": { + TargetName: "product_reviews", + }, + "authorGroups": { + TargetName: "author_groups", + }, + "categoryPreferences": { + TargetName: "category_preferences", + }, + "projectTeams": { + TargetName: "project_teams", + }, }, "BlogPostInput": { "title": { @@ -846,6 +885,15 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { "suggestions": { TargetName: "suggestions", }, + "relatedCategories": { + TargetName: "related_categories", + }, + "contributors": { + TargetName: "contributors", + }, + "categoryGroups": { + TargetName: "category_groups", + }, }, "AuthorInput": { "name": { @@ -869,6 +917,15 @@ func DefaultGRPCMapping() *grpcdatasource.GRPCMapping { "collaborations": { TargetName: "collaborations", }, + "favoriteCategories": { + TargetName: "favorite_categories", + }, + "authorGroups": { + TargetName: "author_groups", + }, + "projectTeams": { + TargetName: "project_teams", + }, }, "BlogPostFilter": { "title": { diff --git a/v2/pkg/grpctest/mockservice.go b/v2/pkg/grpctest/mockservice.go index 3072324138..927b9554ef 100644 --- a/v2/pkg/grpctest/mockservice.go +++ b/v2/pkg/grpctest/mockservice.go @@ -18,6 +18,108 @@ type MockService struct { productv1.UnimplementedProductServiceServer } +// Helper functions to convert input types to output types +func convertCategoryInputsToCategories(inputs []*productv1.CategoryInput) []*productv1.Category { + if inputs == nil { + return nil + } + results := make([]*productv1.Category, len(inputs)) + for i, input := range inputs { + results[i] = &productv1.Category{ + Id: fmt.Sprintf("cat-input-%d", i), + Name: input.GetName(), + Kind: input.GetKind(), + } + } + return results +} + +func convertCategoryInputListToCategories(inputs *productv1.ListOfCategoryInput) []*productv1.Category { + if inputs == nil || inputs.Items == nil { + return nil + } + results := make([]*productv1.Category, len(inputs.Items)) + for i, input := range inputs.Items { + results[i] = &productv1.Category{ + Id: fmt.Sprintf("cat-list-input-%d", i), + Name: input.GetName(), + Kind: input.GetKind(), + } + } + return results +} + +func convertUserInputsToUsers(inputs *productv1.ListOfUserInput) []*productv1.User { + if inputs == nil || inputs.Items == nil { + return nil + } + results := make([]*productv1.User, len(inputs.Items)) + for i, input := range inputs.Items { + results[i] = &productv1.User{ + Id: fmt.Sprintf("user-input-%d", i), + Name: input.GetName(), + } + } + return results +} + +func convertNestedUserInputsToUsers(nestedInputs *productv1.ListOfListOfUserInput) *productv1.ListOfListOfUser { + if nestedInputs == nil || nestedInputs.List == nil { + return &productv1.ListOfListOfUser{ + List: &productv1.ListOfListOfUser_List{ + Items: []*productv1.ListOfUser{}, + }, + } + } + + results := make([]*productv1.ListOfUser, len(nestedInputs.List.Items)) + for i, userList := range nestedInputs.List.Items { + users := make([]*productv1.User, len(userList.Items)) + for j, userInput := range userList.Items { + users[j] = &productv1.User{ + Id: fmt.Sprintf("nested-user-%d-%d", i, j), + Name: userInput.GetName(), + } + } + results[i] = &productv1.ListOfUser{Items: users} + } + + return &productv1.ListOfListOfUser{ + List: &productv1.ListOfListOfUser_List{ + Items: results, + }, + } +} + +func convertNestedCategoryInputsToCategories(nestedInputs *productv1.ListOfListOfCategoryInput) *productv1.ListOfListOfCategory { + if nestedInputs == nil || nestedInputs.List == nil { + return &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{}, + }, + } + } + + results := make([]*productv1.ListOfCategory, len(nestedInputs.List.Items)) + for i, categoryList := range nestedInputs.List.Items { + categories := make([]*productv1.Category, len(categoryList.Items)) + for j, categoryInput := range categoryList.Items { + categories[j] = &productv1.Category{ + Id: fmt.Sprintf("nested-cat-%d-%d", i, j), + Name: categoryInput.GetName(), + Kind: categoryInput.GetKind(), + } + } + results[i] = &productv1.ListOfCategory{Items: categories} + } + + return &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: results, + }, + } +} + // MutationCreateNullableFieldsType implements productv1.ProductServiceServer. func (s *MockService) MutationCreateNullableFieldsType(ctx context.Context, in *productv1.MutationCreateNullableFieldsTypeRequest) (*productv1.MutationCreateNullableFieldsTypeResponse, error) { input := in.GetInput() @@ -914,6 +1016,44 @@ func (s *MockService) QueryBlogPost(ctx context.Context, in *productv1.QueryBlog }, }, }, + RelatedCategories: []*productv1.Category{ + {Id: "cat-1", Name: "Technology", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-2", Name: "Programming", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }, + Contributors: []*productv1.User{ + {Id: "user-1", Name: "John Doe"}, + {Id: "user-2", Name: "Jane Smith"}, + }, + MentionedProducts: &productv1.ListOfProduct{ + Items: []*productv1.Product{ + {Id: "prod-1", Name: "Sample Product", Price: 99.99}, + }, + }, + MentionedUsers: &productv1.ListOfUser{ + Items: []*productv1.User{ + {Id: "user-3", Name: "Bob Johnson"}, + }, + }, + CategoryGroups: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: "cat-3", Name: "Web Development", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-4", Name: "Backend", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }}, + }, + }, + }, + ContributorTeams: &productv1.ListOfListOfUser{ + List: &productv1.ListOfListOfUser_List{ + Items: []*productv1.ListOfUser{ + {Items: []*productv1.User{ + {Id: "user-4", Name: "Alice Brown"}, + {Id: "user-5", Name: "Charlie Wilson"}, + }}, + }, + }, + }, } return &productv1.QueryBlogPostResponse{ @@ -937,15 +1077,50 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query switch id { case "simple": result = &productv1.BlogPost{ - Id: id, - Title: "Simple Post", - Content: "Simple content", - Tags: []string{"simple"}, - Categories: []string{"Basic"}, - ViewCounts: []int32{10}, - TagGroups: &productv1.ListOfListOfString{}, - RelatedTopics: &productv1.ListOfListOfString{}, - CommentThreads: &productv1.ListOfListOfString{}, + Id: id, + Title: "Simple Post", + Content: "Simple content", + Tags: []string{"simple"}, + Categories: []string{"Basic"}, + ViewCounts: []int32{10}, + // Required nested lists must have data + TagGroups: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"simple"}}, + }, + }, + }, + RelatedTopics: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"basic"}}, + }, + }, + }, + CommentThreads: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{"Nice post"}}, + }, + }, + }, + // Required complex lists must have data + RelatedCategories: []*productv1.Category{ + {Id: "cat-simple", Name: "Basic", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + Contributors: []*productv1.User{ + {Id: "user-simple", Name: "Simple Author"}, + }, + CategoryGroups: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: "cat-group-simple", Name: "Simple Category", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, } case "complex": result = &productv1.BlogPost{ @@ -1001,19 +1176,100 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query }, }, }, + // Complex example includes all new complex list fields + RelatedCategories: []*productv1.Category{ + {Id: "cat-complex-1", Name: "Advanced Programming", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-complex-2", Name: "Software Architecture", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }, + Contributors: []*productv1.User{ + {Id: "user-complex-1", Name: "Expert Author"}, + {Id: "user-complex-2", Name: "Technical Reviewer"}, + }, + MentionedProducts: &productv1.ListOfProduct{ + Items: []*productv1.Product{ + {Id: "prod-complex-1", Name: "Advanced IDE", Price: 299.99}, + {Id: "prod-complex-2", Name: "Profiling Tool", Price: 149.99}, + }, + }, + MentionedUsers: &productv1.ListOfUser{ + Items: []*productv1.User{ + {Id: "user-complex-3", Name: "Referenced Expert"}, + }, + }, + CategoryGroups: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: "cat-group-1", Name: "System Design", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-group-2", Name: "Architecture Patterns", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }}, + {Items: []*productv1.Category{ + {Id: "cat-group-3", Name: "Performance", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }}, + }, + }, + }, + ContributorTeams: &productv1.ListOfListOfUser{ + List: &productv1.ListOfListOfUser_List{ + Items: []*productv1.ListOfUser{ + {Items: []*productv1.User{ + {Id: "team-complex-1", Name: "Senior Engineer A"}, + {Id: "team-complex-2", Name: "Senior Engineer B"}, + }}, + {Items: []*productv1.User{ + {Id: "team-complex-3", Name: "QA Lead"}, + }}, + }, + }, + }, } default: // Generic response for any other ID result = &productv1.BlogPost{ - Id: id, - Title: fmt.Sprintf("Blog Post %s", id), - Content: fmt.Sprintf("Content for blog post %s", id), - Tags: []string{fmt.Sprintf("tag-%s", id), "general"}, - Categories: []string{"General", fmt.Sprintf("Category-%s", id)}, - ViewCounts: []int32{int32(len(id) * 10), int32(len(id) * 20)}, - TagGroups: &productv1.ListOfListOfString{}, - RelatedTopics: &productv1.ListOfListOfString{}, - CommentThreads: &productv1.ListOfListOfString{}, + Id: id, + Title: fmt.Sprintf("Blog Post %s", id), + Content: fmt.Sprintf("Content for blog post %s", id), + Tags: []string{fmt.Sprintf("tag-%s", id), "general"}, + Categories: []string{"General", fmt.Sprintf("Category-%s", id)}, + ViewCounts: []int32{int32(len(id) * 10), int32(len(id) * 20)}, + // Required nested lists must have data + TagGroups: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("tag-%s", id), "group"}}, + }, + }, + }, + RelatedTopics: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("topic-%s", id)}}, + }, + }, + }, + CommentThreads: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("Comment on %s", id)}}, + }, + }, + }, + // Required complex lists must have data + RelatedCategories: []*productv1.Category{ + {Id: fmt.Sprintf("cat-%s", id), Name: fmt.Sprintf("Category %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + Contributors: []*productv1.User{ + {Id: fmt.Sprintf("user-%s", id), Name: fmt.Sprintf("Author %s", id)}, + }, + CategoryGroups: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-group-%s", id), Name: fmt.Sprintf("Group Category %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, } } @@ -1067,15 +1323,50 @@ func (s *MockService) QueryBlogPostsWithFilter(ctx context.Context, in *productv } results = append(results, &productv1.BlogPost{ - Id: fmt.Sprintf("filtered-blog-%d", i), - Title: title, - Content: fmt.Sprintf("Filtered content %d", i), - Tags: tags, - Categories: categories, - ViewCounts: []int32{int32(i * 100)}, - TagGroups: &productv1.ListOfListOfString{}, - RelatedTopics: &productv1.ListOfListOfString{}, - CommentThreads: &productv1.ListOfListOfString{}, + Id: fmt.Sprintf("filtered-blog-%d", i), + Title: title, + Content: fmt.Sprintf("Filtered content %d", i), + Tags: tags, + Categories: categories, + ViewCounts: []int32{int32(i * 100)}, + // Required nested lists must have data + TagGroups: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("filtered-tag-%d", i)}}, + }, + }, + }, + RelatedTopics: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("filtered-topic-%d", i)}}, + }, + }, + }, + CommentThreads: &productv1.ListOfListOfString{ + List: &productv1.ListOfListOfString_List{ + Items: []*productv1.ListOfString{ + {Items: []string{fmt.Sprintf("Filtered comment %d", i)}}, + }, + }, + }, + // Required complex lists must have data + RelatedCategories: []*productv1.Category{ + {Id: fmt.Sprintf("cat-filtered-%d", i), Name: fmt.Sprintf("Filtered Category %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + Contributors: []*productv1.User{ + {Id: fmt.Sprintf("user-filtered-%d", i), Name: fmt.Sprintf("Filtered Author %d", i)}, + }, + CategoryGroups: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-group-filtered-%d", i), Name: fmt.Sprintf("Filtered Group %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, }) } @@ -1146,6 +1437,23 @@ func (s *MockService) QueryAllBlogPosts(ctx context.Context, in *productv1.Query }, }, }, + // Required complex lists must have data + RelatedCategories: []*productv1.Category{ + {Id: fmt.Sprintf("cat-all-%d", i), Name: fmt.Sprintf("Category %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + Contributors: []*productv1.User{ + {Id: fmt.Sprintf("user-all-%d", i), Name: fmt.Sprintf("Author %d", i)}, + }, + CategoryGroups: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-group-all-%d", i), Name: fmt.Sprintf("Group Category %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, + // Optional list - can be empty Suggestions: &productv1.ListOfListOfString{}, }) } @@ -1184,6 +1492,50 @@ func (s *MockService) QueryAuthor(ctx context.Context, in *productv1.QueryAuthor }, }, }, + WrittenPosts: &productv1.ListOfBlogPost{ + Items: []*productv1.BlogPost{ + {Id: "blog-1", Title: "GraphQL Best Practices", Content: "Content here..."}, + {Id: "blog-2", Title: "gRPC vs REST", Content: "Comparison content..."}, + }, + }, + FavoriteCategories: []*productv1.Category{ + {Id: "cat-fav-1", Name: "Software Engineering", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-fav-2", Name: "Technical Writing", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }, + RelatedAuthors: &productv1.ListOfUser{ + Items: []*productv1.User{ + {Id: "author-rel-1", Name: "Related Author One"}, + {Id: "author-rel-2", Name: "Related Author Two"}, + }, + }, + ProductReviews: &productv1.ListOfProduct{ + Items: []*productv1.Product{ + {Id: "prod-rev-1", Name: "Code Editor Pro", Price: 199.99}, + }, + }, + AuthorGroups: &productv1.ListOfListOfUser{ + List: &productv1.ListOfListOfUser_List{ + Items: []*productv1.ListOfUser{ + {Items: []*productv1.User{ + {Id: "group-auth-1", Name: "Team Lead Alpha"}, + {Id: "group-auth-2", Name: "Senior Dev Beta"}, + }}, + {Items: []*productv1.User{ + {Id: "group-auth-3", Name: "Junior Dev Gamma"}, + }}, + }, + }, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: "pref-cat-1", Name: "Microservices", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "pref-cat-2", Name: "Cloud Computing", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }}, + }, + }, + }, } return &productv1.QueryAuthorResponse{ @@ -1217,6 +1569,20 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu }, }, }, + // Required complex lists must have data + FavoriteCategories: []*productv1.Category{ + {Id: "cat-minimal", Name: "Basic Category", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: "cat-pref-minimal", Name: "Minimal Preference", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, + // Optional list - can be empty Collaborations: &productv1.ListOfListOfString{}, } case "experienced": @@ -1252,6 +1618,21 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu }, }, }, + // Required complex lists must have data + FavoriteCategories: []*productv1.Category{ + {Id: "cat-experienced-1", Name: "Advanced Programming", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-experienced-2", Name: "Technical Leadership", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: "cat-pref-experienced-1", Name: "System Architecture", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-pref-experienced-2", Name: "Team Management", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }}, + }, + }, + }, } default: result = &productv1.Author{ @@ -1269,6 +1650,20 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu }, }, }, + // Required complex lists must have data + FavoriteCategories: []*productv1.Category{ + {Id: fmt.Sprintf("cat-%s", id), Name: fmt.Sprintf("Favorite Category %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-pref-%s", id), Name: fmt.Sprintf("Preference %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, + // Optional list - can be empty Collaborations: &productv1.ListOfListOfString{}, } } @@ -1335,6 +1730,20 @@ func (s *MockService) QueryAuthorsWithFilter(ctx context.Context, in *productv1. Skills: skills, Languages: []string{"English", fmt.Sprintf("Lang%d", i)}, TeamsByProject: teamsByProject, + // Required complex lists must have data + FavoriteCategories: []*productv1.Category{ + {Id: fmt.Sprintf("cat-filtered-%d", i), Name: fmt.Sprintf("Filtered Category %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-pref-filtered-%d", i), Name: fmt.Sprintf("Filtered Preference %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, + // Optional list - can be empty Collaborations: &productv1.ListOfListOfString{}, }) } @@ -1390,6 +1799,20 @@ func (s *MockService) QueryAllAuthors(ctx context.Context, in *productv1.QueryAl }, }, }, + // Required complex lists must have data + FavoriteCategories: []*productv1.Category{ + {Id: fmt.Sprintf("cat-all-%d", i), Name: fmt.Sprintf("All Category %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-pref-all-%d", i), Name: fmt.Sprintf("All Preference %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }}, + }, + }, + }, + // Optional list - can be empty/variable Collaborations: collaborations, }) } @@ -1418,6 +1841,29 @@ func (s *MockService) MutationCreateBlogPost(ctx context.Context, in *productv1. RelatedTopics: input.GetRelatedTopics(), CommentThreads: input.GetCommentThreads(), Suggestions: input.GetSuggestions(), + // Convert input types to output types + RelatedCategories: convertCategoryInputListToCategories(input.GetRelatedCategories()), + Contributors: convertUserInputsToUsers(input.GetContributors()), + CategoryGroups: convertNestedCategoryInputsToCategories(input.GetCategoryGroups()), + MentionedProducts: &productv1.ListOfProduct{ + Items: []*productv1.Product{ + {Id: "prod-1", Name: "Sample Product", Price: 99.99}, + }, + }, + MentionedUsers: &productv1.ListOfUser{ + Items: []*productv1.User{ + {Id: "user-3", Name: "Bob Johnson"}, + }, + }, + ContributorTeams: &productv1.ListOfListOfUser{ + List: &productv1.ListOfListOfUser_List{ + Items: []*productv1.ListOfUser{ + {Items: []*productv1.User{ + {Id: "user-4", Name: "Alice Brown"}, + }}, + }, + }, + }, } return &productv1.MutationCreateBlogPostResponse{ @@ -1470,6 +1916,35 @@ func (s *MockService) MutationCreateAuthor(ctx context.Context, in *productv1.Mu SocialLinks: input.GetSocialLinks(), TeamsByProject: input.GetTeamsByProject(), Collaborations: input.GetCollaborations(), + // Convert input types to output types for complex fields + FavoriteCategories: convertCategoryInputsToCategories(input.GetFavoriteCategories()), + AuthorGroups: convertNestedUserInputsToUsers(input.GetAuthorGroups()), + ProjectTeams: convertNestedUserInputsToUsers(input.GetProjectTeams()), + // Keep other complex fields with mock data since they're not in the simplified input + WrittenPosts: &productv1.ListOfBlogPost{ + Items: []*productv1.BlogPost{ + {Id: "blog-created", Title: "Created Post", Content: "Content..."}, + }, + }, + RelatedAuthors: &productv1.ListOfUser{ + Items: []*productv1.User{ + {Id: "related-author", Name: "Related Author"}, + }, + }, + ProductReviews: &productv1.ListOfProduct{ + Items: []*productv1.Product{ + {Id: "reviewed-product", Name: "Code Editor", Price: 199.99}, + }, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {Items: []*productv1.Category{ + {Id: "pref-cat", Name: "Backend Development", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }}, + }, + }, + }, } return &productv1.MutationCreateAuthorResponse{ diff --git a/v2/pkg/grpctest/product.proto b/v2/pkg/grpctest/product.proto index a2360899cb..00fd19086e 100644 --- a/v2/pkg/grpctest/product.proto +++ b/v2/pkg/grpctest/product.proto @@ -49,16 +49,47 @@ service ProductService { rpc QueryUsers(QueryUsersRequest) returns (QueryUsersResponse) {} } +// Wrapper message for a list of BlogPost. +message ListOfBlogPost { + repeated BlogPost items = 1; +} + // Wrapper message for a list of Boolean. message ListOfBoolean { repeated bool items = 1; } +// Wrapper message for a list of Category. +message ListOfCategory { + repeated Category items = 1; +} + +// Wrapper message for a list of CategoryInput. +message ListOfCategoryInput { + repeated CategoryInput items = 1; +} + // Wrapper message for a list of Float. message ListOfFloat { repeated double items = 1; } +// Wrapper message for a list of Category. +message ListOfListOfCategory { + message List { + repeated ListOfCategory items = 1; + } + List list = 1; +} + +// Wrapper message for a list of CategoryInput. +message ListOfListOfCategoryInput { + message List { + repeated ListOfCategoryInput items = 1; + } + List list = 1; +} + // Wrapper message for a list of String. message ListOfListOfString { message List { @@ -67,16 +98,47 @@ message ListOfListOfString { List list = 1; } +// Wrapper message for a list of User. +message ListOfListOfUser { + message List { + repeated ListOfUser items = 1; + } + List list = 1; +} + +// Wrapper message for a list of UserInput. +message ListOfListOfUserInput { + message List { + repeated ListOfUserInput items = 1; + } + List list = 1; +} + // Wrapper message for a list of OrderLine. message ListOfOrderLine { repeated OrderLine items = 1; } +// Wrapper message for a list of Product. +message ListOfProduct { + repeated Product items = 1; +} + // Wrapper message for a list of String. message ListOfString { repeated string items = 1; } +// Wrapper message for a list of User. +message ListOfUser { + repeated User items = 1; +} + +// Wrapper message for a list of UserInput. +message ListOfUserInput { + repeated UserInput items = 1; +} + // Key message for Product entity lookup message LookupProductByIdRequestKey { // Key field for Product entity lookup. @@ -551,6 +613,12 @@ message BlogPost { ListOfListOfString related_topics = 12; ListOfListOfString comment_threads = 13; ListOfListOfString suggestions = 14; + repeated Category related_categories = 15; + repeated User contributors = 16; + ListOfProduct mentioned_products = 17; + ListOfUser mentioned_users = 18; + ListOfListOfCategory category_groups = 19; + ListOfListOfUser contributor_teams = 20; } message BlogPostFilter { @@ -568,6 +636,13 @@ message Author { ListOfString social_links = 6; ListOfListOfString teams_by_project = 7; ListOfListOfString collaborations = 8; + ListOfBlogPost written_posts = 9; + repeated Category favorite_categories = 10; + ListOfUser related_authors = 11; + ListOfProduct product_reviews = 12; + ListOfListOfUser author_groups = 13; + ListOfListOfCategory category_preferences = 14; + ListOfListOfUser project_teams = 15; } message AuthorFilter { @@ -616,6 +691,9 @@ message BlogPostInput { ListOfListOfString related_topics = 11; ListOfListOfString comment_threads = 12; ListOfListOfString suggestions = 13; + ListOfCategoryInput related_categories = 14; + ListOfUserInput contributors = 15; + ListOfListOfCategoryInput category_groups = 16; } message AuthorInput { @@ -626,6 +704,9 @@ message AuthorInput { ListOfString social_links = 5; ListOfListOfString teams_by_project = 6; ListOfListOfString collaborations = 7; + repeated CategoryInput favorite_categories = 8; + ListOfListOfUserInput author_groups = 9; + ListOfListOfUserInput project_teams = 10; } message NestedTypeB { diff --git a/v2/pkg/grpctest/productv1/product.pb.go b/v2/pkg/grpctest/productv1/product.pb.go index 8550117854..3dff43ec54 100644 --- a/v2/pkg/grpctest/productv1/product.pb.go +++ b/v2/pkg/grpctest/productv1/product.pb.go @@ -77,6 +77,51 @@ func (CategoryKind) EnumDescriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{0} } +// Wrapper message for a list of BlogPost. +type ListOfBlogPost struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*BlogPost `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfBlogPost) Reset() { + *x = ListOfBlogPost{} + mi := &file_product_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfBlogPost) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfBlogPost) ProtoMessage() {} + +func (x *ListOfBlogPost) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfBlogPost.ProtoReflect.Descriptor instead. +func (*ListOfBlogPost) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{0} +} + +func (x *ListOfBlogPost) GetItems() []*BlogPost { + if x != nil { + return x.Items + } + return nil +} + // Wrapper message for a list of Boolean. type ListOfBoolean struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -87,7 +132,7 @@ type ListOfBoolean struct { func (x *ListOfBoolean) Reset() { *x = ListOfBoolean{} - mi := &file_product_proto_msgTypes[0] + mi := &file_product_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -99,7 +144,412 @@ func (x *ListOfBoolean) String() string { func (*ListOfBoolean) ProtoMessage() {} func (x *ListOfBoolean) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[0] + mi := &file_product_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfBoolean.ProtoReflect.Descriptor instead. +func (*ListOfBoolean) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{1} +} + +func (x *ListOfBoolean) GetItems() []bool { + if x != nil { + return x.Items + } + return nil +} + +// Wrapper message for a list of Category. +type ListOfCategory struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*Category `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfCategory) Reset() { + *x = ListOfCategory{} + mi := &file_product_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfCategory) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfCategory) ProtoMessage() {} + +func (x *ListOfCategory) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfCategory.ProtoReflect.Descriptor instead. +func (*ListOfCategory) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{2} +} + +func (x *ListOfCategory) GetItems() []*Category { + if x != nil { + return x.Items + } + return nil +} + +// Wrapper message for a list of CategoryInput. +type ListOfCategoryInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*CategoryInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfCategoryInput) Reset() { + *x = ListOfCategoryInput{} + mi := &file_product_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfCategoryInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfCategoryInput) ProtoMessage() {} + +func (x *ListOfCategoryInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfCategoryInput.ProtoReflect.Descriptor instead. +func (*ListOfCategoryInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{3} +} + +func (x *ListOfCategoryInput) GetItems() []*CategoryInput { + if x != nil { + return x.Items + } + return nil +} + +// Wrapper message for a list of Float. +type ListOfFloat struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []float64 `protobuf:"fixed64,1,rep,packed,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfFloat) Reset() { + *x = ListOfFloat{} + mi := &file_product_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfFloat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfFloat) ProtoMessage() {} + +func (x *ListOfFloat) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfFloat.ProtoReflect.Descriptor instead. +func (*ListOfFloat) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{4} +} + +func (x *ListOfFloat) GetItems() []float64 { + if x != nil { + return x.Items + } + return nil +} + +// Wrapper message for a list of Category. +type ListOfListOfCategory struct { + state protoimpl.MessageState `protogen:"open.v1"` + List *ListOfListOfCategory_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfCategory) Reset() { + *x = ListOfListOfCategory{} + mi := &file_product_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfCategory) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfCategory) ProtoMessage() {} + +func (x *ListOfListOfCategory) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfCategory.ProtoReflect.Descriptor instead. +func (*ListOfListOfCategory) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{5} +} + +func (x *ListOfListOfCategory) GetList() *ListOfListOfCategory_List { + if x != nil { + return x.List + } + return nil +} + +// Wrapper message for a list of CategoryInput. +type ListOfListOfCategoryInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + List *ListOfListOfCategoryInput_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfCategoryInput) Reset() { + *x = ListOfListOfCategoryInput{} + mi := &file_product_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfCategoryInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfCategoryInput) ProtoMessage() {} + +func (x *ListOfListOfCategoryInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfCategoryInput.ProtoReflect.Descriptor instead. +func (*ListOfListOfCategoryInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{6} +} + +func (x *ListOfListOfCategoryInput) GetList() *ListOfListOfCategoryInput_List { + if x != nil { + return x.List + } + return nil +} + +// Wrapper message for a list of String. +type ListOfListOfString struct { + state protoimpl.MessageState `protogen:"open.v1"` + List *ListOfListOfString_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfString) Reset() { + *x = ListOfListOfString{} + mi := &file_product_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfString) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfString) ProtoMessage() {} + +func (x *ListOfListOfString) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfString.ProtoReflect.Descriptor instead. +func (*ListOfListOfString) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{7} +} + +func (x *ListOfListOfString) GetList() *ListOfListOfString_List { + if x != nil { + return x.List + } + return nil +} + +// Wrapper message for a list of User. +type ListOfListOfUser struct { + state protoimpl.MessageState `protogen:"open.v1"` + List *ListOfListOfUser_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfUser) Reset() { + *x = ListOfListOfUser{} + mi := &file_product_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfUser) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfUser) ProtoMessage() {} + +func (x *ListOfListOfUser) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfUser.ProtoReflect.Descriptor instead. +func (*ListOfListOfUser) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{8} +} + +func (x *ListOfListOfUser) GetList() *ListOfListOfUser_List { + if x != nil { + return x.List + } + return nil +} + +// Wrapper message for a list of UserInput. +type ListOfListOfUserInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + List *ListOfListOfUserInput_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfUserInput) Reset() { + *x = ListOfListOfUserInput{} + mi := &file_product_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfUserInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfUserInput) ProtoMessage() {} + +func (x *ListOfListOfUserInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfUserInput.ProtoReflect.Descriptor instead. +func (*ListOfListOfUserInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{9} +} + +func (x *ListOfListOfUserInput) GetList() *ListOfListOfUserInput_List { + if x != nil { + return x.List + } + return nil +} + +// Wrapper message for a list of OrderLine. +type ListOfOrderLine struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*OrderLine `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfOrderLine) Reset() { + *x = ListOfOrderLine{} + mi := &file_product_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfOrderLine) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfOrderLine) ProtoMessage() {} + +func (x *ListOfOrderLine) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -110,41 +560,41 @@ func (x *ListOfBoolean) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListOfBoolean.ProtoReflect.Descriptor instead. -func (*ListOfBoolean) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{0} +// Deprecated: Use ListOfOrderLine.ProtoReflect.Descriptor instead. +func (*ListOfOrderLine) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{10} } -func (x *ListOfBoolean) GetItems() []bool { +func (x *ListOfOrderLine) GetItems() []*OrderLine { if x != nil { return x.Items } return nil } -// Wrapper message for a list of Float. -type ListOfFloat struct { +// Wrapper message for a list of Product. +type ListOfProduct struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []float64 `protobuf:"fixed64,1,rep,packed,name=items,proto3" json:"items,omitempty"` + Items []*Product `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListOfFloat) Reset() { - *x = ListOfFloat{} - mi := &file_product_proto_msgTypes[1] +func (x *ListOfProduct) Reset() { + *x = ListOfProduct{} + mi := &file_product_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListOfFloat) String() string { +func (x *ListOfProduct) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListOfFloat) ProtoMessage() {} +func (*ListOfProduct) ProtoMessage() {} -func (x *ListOfFloat) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[1] +func (x *ListOfProduct) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -155,12 +605,12 @@ func (x *ListOfFloat) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListOfFloat.ProtoReflect.Descriptor instead. -func (*ListOfFloat) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{1} +// Deprecated: Use ListOfProduct.ProtoReflect.Descriptor instead. +func (*ListOfProduct) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{11} } -func (x *ListOfFloat) GetItems() []float64 { +func (x *ListOfProduct) GetItems() []*Product { if x != nil { return x.Items } @@ -168,28 +618,28 @@ func (x *ListOfFloat) GetItems() []float64 { } // Wrapper message for a list of String. -type ListOfListOfString struct { - state protoimpl.MessageState `protogen:"open.v1"` - List *ListOfListOfString_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` +type ListOfString struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []string `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListOfListOfString) Reset() { - *x = ListOfListOfString{} - mi := &file_product_proto_msgTypes[2] +func (x *ListOfString) Reset() { + *x = ListOfString{} + mi := &file_product_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListOfListOfString) String() string { +func (x *ListOfString) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListOfListOfString) ProtoMessage() {} +func (*ListOfString) ProtoMessage() {} -func (x *ListOfListOfString) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[2] +func (x *ListOfString) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -200,41 +650,41 @@ func (x *ListOfListOfString) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListOfListOfString.ProtoReflect.Descriptor instead. -func (*ListOfListOfString) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{2} +// Deprecated: Use ListOfString.ProtoReflect.Descriptor instead. +func (*ListOfString) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{12} } -func (x *ListOfListOfString) GetList() *ListOfListOfString_List { +func (x *ListOfString) GetItems() []string { if x != nil { - return x.List + return x.Items } return nil } -// Wrapper message for a list of OrderLine. -type ListOfOrderLine struct { +// Wrapper message for a list of User. +type ListOfUser struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []*OrderLine `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Items []*User `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListOfOrderLine) Reset() { - *x = ListOfOrderLine{} - mi := &file_product_proto_msgTypes[3] +func (x *ListOfUser) Reset() { + *x = ListOfUser{} + mi := &file_product_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListOfOrderLine) String() string { +func (x *ListOfUser) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListOfOrderLine) ProtoMessage() {} +func (*ListOfUser) ProtoMessage() {} -func (x *ListOfOrderLine) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[3] +func (x *ListOfUser) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -245,41 +695,41 @@ func (x *ListOfOrderLine) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListOfOrderLine.ProtoReflect.Descriptor instead. -func (*ListOfOrderLine) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{3} +// Deprecated: Use ListOfUser.ProtoReflect.Descriptor instead. +func (*ListOfUser) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{13} } -func (x *ListOfOrderLine) GetItems() []*OrderLine { +func (x *ListOfUser) GetItems() []*User { if x != nil { return x.Items } return nil } -// Wrapper message for a list of String. -type ListOfString struct { +// Wrapper message for a list of UserInput. +type ListOfUserInput struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []string `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Items []*UserInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListOfString) Reset() { - *x = ListOfString{} - mi := &file_product_proto_msgTypes[4] +func (x *ListOfUserInput) Reset() { + *x = ListOfUserInput{} + mi := &file_product_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListOfString) String() string { +func (x *ListOfUserInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListOfString) ProtoMessage() {} +func (*ListOfUserInput) ProtoMessage() {} -func (x *ListOfString) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[4] +func (x *ListOfUserInput) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -290,12 +740,12 @@ func (x *ListOfString) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListOfString.ProtoReflect.Descriptor instead. -func (*ListOfString) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{4} +// Deprecated: Use ListOfUserInput.ProtoReflect.Descriptor instead. +func (*ListOfUserInput) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{14} } -func (x *ListOfString) GetItems() []string { +func (x *ListOfUserInput) GetItems() []*UserInput { if x != nil { return x.Items } @@ -313,7 +763,7 @@ type LookupProductByIdRequestKey struct { func (x *LookupProductByIdRequestKey) Reset() { *x = LookupProductByIdRequestKey{} - mi := &file_product_proto_msgTypes[5] + mi := &file_product_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -325,7 +775,7 @@ func (x *LookupProductByIdRequestKey) String() string { func (*LookupProductByIdRequestKey) ProtoMessage() {} func (x *LookupProductByIdRequestKey) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[5] + mi := &file_product_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -338,7 +788,7 @@ func (x *LookupProductByIdRequestKey) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdRequestKey.ProtoReflect.Descriptor instead. func (*LookupProductByIdRequestKey) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{5} + return file_product_proto_rawDescGZIP(), []int{15} } func (x *LookupProductByIdRequestKey) GetId() string { @@ -360,7 +810,7 @@ type LookupProductByIdRequest struct { func (x *LookupProductByIdRequest) Reset() { *x = LookupProductByIdRequest{} - mi := &file_product_proto_msgTypes[6] + mi := &file_product_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -372,7 +822,7 @@ func (x *LookupProductByIdRequest) String() string { func (*LookupProductByIdRequest) ProtoMessage() {} func (x *LookupProductByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[6] + mi := &file_product_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -385,7 +835,7 @@ func (x *LookupProductByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdRequest.ProtoReflect.Descriptor instead. func (*LookupProductByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{6} + return file_product_proto_rawDescGZIP(), []int{16} } func (x *LookupProductByIdRequest) GetKeys() []*LookupProductByIdRequestKey { @@ -418,7 +868,7 @@ type LookupProductByIdResponse struct { func (x *LookupProductByIdResponse) Reset() { *x = LookupProductByIdResponse{} - mi := &file_product_proto_msgTypes[7] + mi := &file_product_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -430,7 +880,7 @@ func (x *LookupProductByIdResponse) String() string { func (*LookupProductByIdResponse) ProtoMessage() {} func (x *LookupProductByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[7] + mi := &file_product_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -443,7 +893,7 @@ func (x *LookupProductByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupProductByIdResponse.ProtoReflect.Descriptor instead. func (*LookupProductByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{7} + return file_product_proto_rawDescGZIP(), []int{17} } func (x *LookupProductByIdResponse) GetResult() []*Product { @@ -464,7 +914,7 @@ type LookupStorageByIdRequestKey struct { func (x *LookupStorageByIdRequestKey) Reset() { *x = LookupStorageByIdRequestKey{} - mi := &file_product_proto_msgTypes[8] + mi := &file_product_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -476,7 +926,7 @@ func (x *LookupStorageByIdRequestKey) String() string { func (*LookupStorageByIdRequestKey) ProtoMessage() {} func (x *LookupStorageByIdRequestKey) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[8] + mi := &file_product_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -489,7 +939,7 @@ func (x *LookupStorageByIdRequestKey) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdRequestKey.ProtoReflect.Descriptor instead. func (*LookupStorageByIdRequestKey) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{8} + return file_product_proto_rawDescGZIP(), []int{18} } func (x *LookupStorageByIdRequestKey) GetId() string { @@ -511,7 +961,7 @@ type LookupStorageByIdRequest struct { func (x *LookupStorageByIdRequest) Reset() { *x = LookupStorageByIdRequest{} - mi := &file_product_proto_msgTypes[9] + mi := &file_product_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -523,7 +973,7 @@ func (x *LookupStorageByIdRequest) String() string { func (*LookupStorageByIdRequest) ProtoMessage() {} func (x *LookupStorageByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[9] + mi := &file_product_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -536,7 +986,7 @@ func (x *LookupStorageByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdRequest.ProtoReflect.Descriptor instead. func (*LookupStorageByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{9} + return file_product_proto_rawDescGZIP(), []int{19} } func (x *LookupStorageByIdRequest) GetKeys() []*LookupStorageByIdRequestKey { @@ -569,7 +1019,7 @@ type LookupStorageByIdResponse struct { func (x *LookupStorageByIdResponse) Reset() { *x = LookupStorageByIdResponse{} - mi := &file_product_proto_msgTypes[10] + mi := &file_product_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -581,7 +1031,7 @@ func (x *LookupStorageByIdResponse) String() string { func (*LookupStorageByIdResponse) ProtoMessage() {} func (x *LookupStorageByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[10] + mi := &file_product_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +1044,7 @@ func (x *LookupStorageByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupStorageByIdResponse.ProtoReflect.Descriptor instead. func (*LookupStorageByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{10} + return file_product_proto_rawDescGZIP(), []int{20} } func (x *LookupStorageByIdResponse) GetResult() []*Storage { @@ -613,7 +1063,7 @@ type QueryUsersRequest struct { func (x *QueryUsersRequest) Reset() { *x = QueryUsersRequest{} - mi := &file_product_proto_msgTypes[11] + mi := &file_product_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -625,7 +1075,7 @@ func (x *QueryUsersRequest) String() string { func (*QueryUsersRequest) ProtoMessage() {} func (x *QueryUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[11] + mi := &file_product_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -638,7 +1088,7 @@ func (x *QueryUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUsersRequest.ProtoReflect.Descriptor instead. func (*QueryUsersRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{11} + return file_product_proto_rawDescGZIP(), []int{21} } // Response message for users operation. @@ -651,7 +1101,7 @@ type QueryUsersResponse struct { func (x *QueryUsersResponse) Reset() { *x = QueryUsersResponse{} - mi := &file_product_proto_msgTypes[12] + mi := &file_product_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -663,7 +1113,7 @@ func (x *QueryUsersResponse) String() string { func (*QueryUsersResponse) ProtoMessage() {} func (x *QueryUsersResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[12] + mi := &file_product_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -676,7 +1126,7 @@ func (x *QueryUsersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUsersResponse.ProtoReflect.Descriptor instead. func (*QueryUsersResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{12} + return file_product_proto_rawDescGZIP(), []int{22} } func (x *QueryUsersResponse) GetUsers() []*User { @@ -696,7 +1146,7 @@ type QueryUserRequest struct { func (x *QueryUserRequest) Reset() { *x = QueryUserRequest{} - mi := &file_product_proto_msgTypes[13] + mi := &file_product_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -708,7 +1158,7 @@ func (x *QueryUserRequest) String() string { func (*QueryUserRequest) ProtoMessage() {} func (x *QueryUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[13] + mi := &file_product_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -721,7 +1171,7 @@ func (x *QueryUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUserRequest.ProtoReflect.Descriptor instead. func (*QueryUserRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{13} + return file_product_proto_rawDescGZIP(), []int{23} } func (x *QueryUserRequest) GetId() string { @@ -741,7 +1191,7 @@ type QueryUserResponse struct { func (x *QueryUserResponse) Reset() { *x = QueryUserResponse{} - mi := &file_product_proto_msgTypes[14] + mi := &file_product_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -753,7 +1203,7 @@ func (x *QueryUserResponse) String() string { func (*QueryUserResponse) ProtoMessage() {} func (x *QueryUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[14] + mi := &file_product_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -766,7 +1216,7 @@ func (x *QueryUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryUserResponse.ProtoReflect.Descriptor instead. func (*QueryUserResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{14} + return file_product_proto_rawDescGZIP(), []int{24} } func (x *QueryUserResponse) GetUser() *User { @@ -785,7 +1235,7 @@ type QueryNestedTypeRequest struct { func (x *QueryNestedTypeRequest) Reset() { *x = QueryNestedTypeRequest{} - mi := &file_product_proto_msgTypes[15] + mi := &file_product_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -797,7 +1247,7 @@ func (x *QueryNestedTypeRequest) String() string { func (*QueryNestedTypeRequest) ProtoMessage() {} func (x *QueryNestedTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[15] + mi := &file_product_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -810,7 +1260,7 @@ func (x *QueryNestedTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNestedTypeRequest.ProtoReflect.Descriptor instead. func (*QueryNestedTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{15} + return file_product_proto_rawDescGZIP(), []int{25} } // Response message for nestedType operation. @@ -823,7 +1273,7 @@ type QueryNestedTypeResponse struct { func (x *QueryNestedTypeResponse) Reset() { *x = QueryNestedTypeResponse{} - mi := &file_product_proto_msgTypes[16] + mi := &file_product_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -835,7 +1285,7 @@ func (x *QueryNestedTypeResponse) String() string { func (*QueryNestedTypeResponse) ProtoMessage() {} func (x *QueryNestedTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[16] + mi := &file_product_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -848,7 +1298,7 @@ func (x *QueryNestedTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNestedTypeResponse.ProtoReflect.Descriptor instead. func (*QueryNestedTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{16} + return file_product_proto_rawDescGZIP(), []int{26} } func (x *QueryNestedTypeResponse) GetNestedType() []*NestedTypeA { @@ -867,7 +1317,7 @@ type QueryRecursiveTypeRequest struct { func (x *QueryRecursiveTypeRequest) Reset() { *x = QueryRecursiveTypeRequest{} - mi := &file_product_proto_msgTypes[17] + mi := &file_product_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -879,7 +1329,7 @@ func (x *QueryRecursiveTypeRequest) String() string { func (*QueryRecursiveTypeRequest) ProtoMessage() {} func (x *QueryRecursiveTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[17] + mi := &file_product_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -892,7 +1342,7 @@ func (x *QueryRecursiveTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRecursiveTypeRequest.ProtoReflect.Descriptor instead. func (*QueryRecursiveTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{17} + return file_product_proto_rawDescGZIP(), []int{27} } // Response message for recursiveType operation. @@ -905,7 +1355,7 @@ type QueryRecursiveTypeResponse struct { func (x *QueryRecursiveTypeResponse) Reset() { *x = QueryRecursiveTypeResponse{} - mi := &file_product_proto_msgTypes[18] + mi := &file_product_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -917,7 +1367,7 @@ func (x *QueryRecursiveTypeResponse) String() string { func (*QueryRecursiveTypeResponse) ProtoMessage() {} func (x *QueryRecursiveTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[18] + mi := &file_product_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -930,7 +1380,7 @@ func (x *QueryRecursiveTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRecursiveTypeResponse.ProtoReflect.Descriptor instead. func (*QueryRecursiveTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{18} + return file_product_proto_rawDescGZIP(), []int{28} } func (x *QueryRecursiveTypeResponse) GetRecursiveType() *RecursiveType { @@ -951,7 +1401,7 @@ type QueryTypeFilterWithArgumentsRequest struct { func (x *QueryTypeFilterWithArgumentsRequest) Reset() { *x = QueryTypeFilterWithArgumentsRequest{} - mi := &file_product_proto_msgTypes[19] + mi := &file_product_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -963,7 +1413,7 @@ func (x *QueryTypeFilterWithArgumentsRequest) String() string { func (*QueryTypeFilterWithArgumentsRequest) ProtoMessage() {} func (x *QueryTypeFilterWithArgumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[19] + mi := &file_product_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -976,7 +1426,7 @@ func (x *QueryTypeFilterWithArgumentsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryTypeFilterWithArgumentsRequest.ProtoReflect.Descriptor instead. func (*QueryTypeFilterWithArgumentsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{19} + return file_product_proto_rawDescGZIP(), []int{29} } func (x *QueryTypeFilterWithArgumentsRequest) GetFilterField_1() string { @@ -1003,7 +1453,7 @@ type QueryTypeFilterWithArgumentsResponse struct { func (x *QueryTypeFilterWithArgumentsResponse) Reset() { *x = QueryTypeFilterWithArgumentsResponse{} - mi := &file_product_proto_msgTypes[20] + mi := &file_product_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1015,7 +1465,7 @@ func (x *QueryTypeFilterWithArgumentsResponse) String() string { func (*QueryTypeFilterWithArgumentsResponse) ProtoMessage() {} func (x *QueryTypeFilterWithArgumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[20] + mi := &file_product_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1028,7 +1478,7 @@ func (x *QueryTypeFilterWithArgumentsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use QueryTypeFilterWithArgumentsResponse.ProtoReflect.Descriptor instead. func (*QueryTypeFilterWithArgumentsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{20} + return file_product_proto_rawDescGZIP(), []int{30} } func (x *QueryTypeFilterWithArgumentsResponse) GetTypeFilterWithArguments() []*TypeWithMultipleFilterFields { @@ -1048,7 +1498,7 @@ type QueryTypeWithMultipleFilterFieldsRequest struct { func (x *QueryTypeWithMultipleFilterFieldsRequest) Reset() { *x = QueryTypeWithMultipleFilterFieldsRequest{} - mi := &file_product_proto_msgTypes[21] + mi := &file_product_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1060,7 +1510,7 @@ func (x *QueryTypeWithMultipleFilterFieldsRequest) String() string { func (*QueryTypeWithMultipleFilterFieldsRequest) ProtoMessage() {} func (x *QueryTypeWithMultipleFilterFieldsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[21] + mi := &file_product_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1073,7 +1523,7 @@ func (x *QueryTypeWithMultipleFilterFieldsRequest) ProtoReflect() protoreflect.M // Deprecated: Use QueryTypeWithMultipleFilterFieldsRequest.ProtoReflect.Descriptor instead. func (*QueryTypeWithMultipleFilterFieldsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{21} + return file_product_proto_rawDescGZIP(), []int{31} } func (x *QueryTypeWithMultipleFilterFieldsRequest) GetFilter() *FilterTypeInput { @@ -1093,7 +1543,7 @@ type QueryTypeWithMultipleFilterFieldsResponse struct { func (x *QueryTypeWithMultipleFilterFieldsResponse) Reset() { *x = QueryTypeWithMultipleFilterFieldsResponse{} - mi := &file_product_proto_msgTypes[22] + mi := &file_product_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1105,7 +1555,7 @@ func (x *QueryTypeWithMultipleFilterFieldsResponse) String() string { func (*QueryTypeWithMultipleFilterFieldsResponse) ProtoMessage() {} func (x *QueryTypeWithMultipleFilterFieldsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[22] + mi := &file_product_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1118,7 +1568,7 @@ func (x *QueryTypeWithMultipleFilterFieldsResponse) ProtoReflect() protoreflect. // Deprecated: Use QueryTypeWithMultipleFilterFieldsResponse.ProtoReflect.Descriptor instead. func (*QueryTypeWithMultipleFilterFieldsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{22} + return file_product_proto_rawDescGZIP(), []int{32} } func (x *QueryTypeWithMultipleFilterFieldsResponse) GetTypeWithMultipleFilterFields() []*TypeWithMultipleFilterFields { @@ -1138,7 +1588,7 @@ type QueryComplexFilterTypeRequest struct { func (x *QueryComplexFilterTypeRequest) Reset() { *x = QueryComplexFilterTypeRequest{} - mi := &file_product_proto_msgTypes[23] + mi := &file_product_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1150,7 +1600,7 @@ func (x *QueryComplexFilterTypeRequest) String() string { func (*QueryComplexFilterTypeRequest) ProtoMessage() {} func (x *QueryComplexFilterTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[23] + mi := &file_product_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1163,7 +1613,7 @@ func (x *QueryComplexFilterTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryComplexFilterTypeRequest.ProtoReflect.Descriptor instead. func (*QueryComplexFilterTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{23} + return file_product_proto_rawDescGZIP(), []int{33} } func (x *QueryComplexFilterTypeRequest) GetFilter() *ComplexFilterTypeInput { @@ -1183,7 +1633,7 @@ type QueryComplexFilterTypeResponse struct { func (x *QueryComplexFilterTypeResponse) Reset() { *x = QueryComplexFilterTypeResponse{} - mi := &file_product_proto_msgTypes[24] + mi := &file_product_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1195,7 +1645,7 @@ func (x *QueryComplexFilterTypeResponse) String() string { func (*QueryComplexFilterTypeResponse) ProtoMessage() {} func (x *QueryComplexFilterTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[24] + mi := &file_product_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1208,7 +1658,7 @@ func (x *QueryComplexFilterTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryComplexFilterTypeResponse.ProtoReflect.Descriptor instead. func (*QueryComplexFilterTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{24} + return file_product_proto_rawDescGZIP(), []int{34} } func (x *QueryComplexFilterTypeResponse) GetComplexFilterType() []*TypeWithComplexFilterInput { @@ -1228,7 +1678,7 @@ type QueryCalculateTotalsRequest struct { func (x *QueryCalculateTotalsRequest) Reset() { *x = QueryCalculateTotalsRequest{} - mi := &file_product_proto_msgTypes[25] + mi := &file_product_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1240,7 +1690,7 @@ func (x *QueryCalculateTotalsRequest) String() string { func (*QueryCalculateTotalsRequest) ProtoMessage() {} func (x *QueryCalculateTotalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[25] + mi := &file_product_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1253,7 +1703,7 @@ func (x *QueryCalculateTotalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCalculateTotalsRequest.ProtoReflect.Descriptor instead. func (*QueryCalculateTotalsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{25} + return file_product_proto_rawDescGZIP(), []int{35} } func (x *QueryCalculateTotalsRequest) GetOrders() []*OrderInput { @@ -1273,7 +1723,7 @@ type QueryCalculateTotalsResponse struct { func (x *QueryCalculateTotalsResponse) Reset() { *x = QueryCalculateTotalsResponse{} - mi := &file_product_proto_msgTypes[26] + mi := &file_product_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1285,7 +1735,7 @@ func (x *QueryCalculateTotalsResponse) String() string { func (*QueryCalculateTotalsResponse) ProtoMessage() {} func (x *QueryCalculateTotalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[26] + mi := &file_product_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1298,7 +1748,7 @@ func (x *QueryCalculateTotalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCalculateTotalsResponse.ProtoReflect.Descriptor instead. func (*QueryCalculateTotalsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{26} + return file_product_proto_rawDescGZIP(), []int{36} } func (x *QueryCalculateTotalsResponse) GetCalculateTotals() []*Order { @@ -1317,7 +1767,7 @@ type QueryCategoriesRequest struct { func (x *QueryCategoriesRequest) Reset() { *x = QueryCategoriesRequest{} - mi := &file_product_proto_msgTypes[27] + mi := &file_product_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1329,7 +1779,7 @@ func (x *QueryCategoriesRequest) String() string { func (*QueryCategoriesRequest) ProtoMessage() {} func (x *QueryCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[27] + mi := &file_product_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1342,7 +1792,7 @@ func (x *QueryCategoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{27} + return file_product_proto_rawDescGZIP(), []int{37} } // Response message for categories operation. @@ -1355,7 +1805,7 @@ type QueryCategoriesResponse struct { func (x *QueryCategoriesResponse) Reset() { *x = QueryCategoriesResponse{} - mi := &file_product_proto_msgTypes[28] + mi := &file_product_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1367,7 +1817,7 @@ func (x *QueryCategoriesResponse) String() string { func (*QueryCategoriesResponse) ProtoMessage() {} func (x *QueryCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[28] + mi := &file_product_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1380,7 +1830,7 @@ func (x *QueryCategoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{28} + return file_product_proto_rawDescGZIP(), []int{38} } func (x *QueryCategoriesResponse) GetCategories() []*Category { @@ -1400,7 +1850,7 @@ type QueryCategoriesByKindRequest struct { func (x *QueryCategoriesByKindRequest) Reset() { *x = QueryCategoriesByKindRequest{} - mi := &file_product_proto_msgTypes[29] + mi := &file_product_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1412,7 +1862,7 @@ func (x *QueryCategoriesByKindRequest) String() string { func (*QueryCategoriesByKindRequest) ProtoMessage() {} func (x *QueryCategoriesByKindRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[29] + mi := &file_product_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1425,7 +1875,7 @@ func (x *QueryCategoriesByKindRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{29} + return file_product_proto_rawDescGZIP(), []int{39} } func (x *QueryCategoriesByKindRequest) GetKind() CategoryKind { @@ -1445,7 +1895,7 @@ type QueryCategoriesByKindResponse struct { func (x *QueryCategoriesByKindResponse) Reset() { *x = QueryCategoriesByKindResponse{} - mi := &file_product_proto_msgTypes[30] + mi := &file_product_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1457,7 +1907,7 @@ func (x *QueryCategoriesByKindResponse) String() string { func (*QueryCategoriesByKindResponse) ProtoMessage() {} func (x *QueryCategoriesByKindResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[30] + mi := &file_product_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1470,7 +1920,7 @@ func (x *QueryCategoriesByKindResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{30} + return file_product_proto_rawDescGZIP(), []int{40} } func (x *QueryCategoriesByKindResponse) GetCategoriesByKind() []*Category { @@ -1490,7 +1940,7 @@ type QueryCategoriesByKindsRequest struct { func (x *QueryCategoriesByKindsRequest) Reset() { *x = QueryCategoriesByKindsRequest{} - mi := &file_product_proto_msgTypes[31] + mi := &file_product_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1502,7 +1952,7 @@ func (x *QueryCategoriesByKindsRequest) String() string { func (*QueryCategoriesByKindsRequest) ProtoMessage() {} func (x *QueryCategoriesByKindsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[31] + mi := &file_product_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1515,7 +1965,7 @@ func (x *QueryCategoriesByKindsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindsRequest.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{31} + return file_product_proto_rawDescGZIP(), []int{41} } func (x *QueryCategoriesByKindsRequest) GetKinds() []CategoryKind { @@ -1535,7 +1985,7 @@ type QueryCategoriesByKindsResponse struct { func (x *QueryCategoriesByKindsResponse) Reset() { *x = QueryCategoriesByKindsResponse{} - mi := &file_product_proto_msgTypes[32] + mi := &file_product_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1547,7 +1997,7 @@ func (x *QueryCategoriesByKindsResponse) String() string { func (*QueryCategoriesByKindsResponse) ProtoMessage() {} func (x *QueryCategoriesByKindsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[32] + mi := &file_product_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1560,7 +2010,7 @@ func (x *QueryCategoriesByKindsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryCategoriesByKindsResponse.ProtoReflect.Descriptor instead. func (*QueryCategoriesByKindsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{32} + return file_product_proto_rawDescGZIP(), []int{42} } func (x *QueryCategoriesByKindsResponse) GetCategoriesByKinds() []*Category { @@ -1580,7 +2030,7 @@ type QueryFilterCategoriesRequest struct { func (x *QueryFilterCategoriesRequest) Reset() { *x = QueryFilterCategoriesRequest{} - mi := &file_product_proto_msgTypes[33] + mi := &file_product_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1592,7 +2042,7 @@ func (x *QueryFilterCategoriesRequest) String() string { func (*QueryFilterCategoriesRequest) ProtoMessage() {} func (x *QueryFilterCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[33] + mi := &file_product_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1605,7 +2055,7 @@ func (x *QueryFilterCategoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFilterCategoriesRequest.ProtoReflect.Descriptor instead. func (*QueryFilterCategoriesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{33} + return file_product_proto_rawDescGZIP(), []int{43} } func (x *QueryFilterCategoriesRequest) GetFilter() *CategoryFilter { @@ -1625,7 +2075,7 @@ type QueryFilterCategoriesResponse struct { func (x *QueryFilterCategoriesResponse) Reset() { *x = QueryFilterCategoriesResponse{} - mi := &file_product_proto_msgTypes[34] + mi := &file_product_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1637,7 +2087,7 @@ func (x *QueryFilterCategoriesResponse) String() string { func (*QueryFilterCategoriesResponse) ProtoMessage() {} func (x *QueryFilterCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[34] + mi := &file_product_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1650,7 +2100,7 @@ func (x *QueryFilterCategoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFilterCategoriesResponse.ProtoReflect.Descriptor instead. func (*QueryFilterCategoriesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{34} + return file_product_proto_rawDescGZIP(), []int{44} } func (x *QueryFilterCategoriesResponse) GetFilterCategories() []*Category { @@ -1669,7 +2119,7 @@ type QueryRandomPetRequest struct { func (x *QueryRandomPetRequest) Reset() { *x = QueryRandomPetRequest{} - mi := &file_product_proto_msgTypes[35] + mi := &file_product_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1681,7 +2131,7 @@ func (x *QueryRandomPetRequest) String() string { func (*QueryRandomPetRequest) ProtoMessage() {} func (x *QueryRandomPetRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[35] + mi := &file_product_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1694,7 +2144,7 @@ func (x *QueryRandomPetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomPetRequest.ProtoReflect.Descriptor instead. func (*QueryRandomPetRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{35} + return file_product_proto_rawDescGZIP(), []int{45} } // Response message for randomPet operation. @@ -1707,7 +2157,7 @@ type QueryRandomPetResponse struct { func (x *QueryRandomPetResponse) Reset() { *x = QueryRandomPetResponse{} - mi := &file_product_proto_msgTypes[36] + mi := &file_product_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1719,7 +2169,7 @@ func (x *QueryRandomPetResponse) String() string { func (*QueryRandomPetResponse) ProtoMessage() {} func (x *QueryRandomPetResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[36] + mi := &file_product_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1732,7 +2182,7 @@ func (x *QueryRandomPetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomPetResponse.ProtoReflect.Descriptor instead. func (*QueryRandomPetResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{36} + return file_product_proto_rawDescGZIP(), []int{46} } func (x *QueryRandomPetResponse) GetRandomPet() *Animal { @@ -1751,7 +2201,7 @@ type QueryAllPetsRequest struct { func (x *QueryAllPetsRequest) Reset() { *x = QueryAllPetsRequest{} - mi := &file_product_proto_msgTypes[37] + mi := &file_product_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1763,7 +2213,7 @@ func (x *QueryAllPetsRequest) String() string { func (*QueryAllPetsRequest) ProtoMessage() {} func (x *QueryAllPetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[37] + mi := &file_product_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1776,7 +2226,7 @@ func (x *QueryAllPetsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllPetsRequest.ProtoReflect.Descriptor instead. func (*QueryAllPetsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{37} + return file_product_proto_rawDescGZIP(), []int{47} } // Response message for allPets operation. @@ -1789,7 +2239,7 @@ type QueryAllPetsResponse struct { func (x *QueryAllPetsResponse) Reset() { *x = QueryAllPetsResponse{} - mi := &file_product_proto_msgTypes[38] + mi := &file_product_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1801,7 +2251,7 @@ func (x *QueryAllPetsResponse) String() string { func (*QueryAllPetsResponse) ProtoMessage() {} func (x *QueryAllPetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[38] + mi := &file_product_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1814,7 +2264,7 @@ func (x *QueryAllPetsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllPetsResponse.ProtoReflect.Descriptor instead. func (*QueryAllPetsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{38} + return file_product_proto_rawDescGZIP(), []int{48} } func (x *QueryAllPetsResponse) GetAllPets() []*Animal { @@ -1834,7 +2284,7 @@ type QuerySearchRequest struct { func (x *QuerySearchRequest) Reset() { *x = QuerySearchRequest{} - mi := &file_product_proto_msgTypes[39] + mi := &file_product_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1846,7 +2296,7 @@ func (x *QuerySearchRequest) String() string { func (*QuerySearchRequest) ProtoMessage() {} func (x *QuerySearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[39] + mi := &file_product_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1859,7 +2309,7 @@ func (x *QuerySearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QuerySearchRequest.ProtoReflect.Descriptor instead. func (*QuerySearchRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{39} + return file_product_proto_rawDescGZIP(), []int{49} } func (x *QuerySearchRequest) GetInput() *SearchInput { @@ -1879,7 +2329,7 @@ type QuerySearchResponse struct { func (x *QuerySearchResponse) Reset() { *x = QuerySearchResponse{} - mi := &file_product_proto_msgTypes[40] + mi := &file_product_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1891,7 +2341,7 @@ func (x *QuerySearchResponse) String() string { func (*QuerySearchResponse) ProtoMessage() {} func (x *QuerySearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[40] + mi := &file_product_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1904,7 +2354,7 @@ func (x *QuerySearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QuerySearchResponse.ProtoReflect.Descriptor instead. func (*QuerySearchResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{40} + return file_product_proto_rawDescGZIP(), []int{50} } func (x *QuerySearchResponse) GetSearch() []*SearchResult { @@ -1923,7 +2373,7 @@ type QueryRandomSearchResultRequest struct { func (x *QueryRandomSearchResultRequest) Reset() { *x = QueryRandomSearchResultRequest{} - mi := &file_product_proto_msgTypes[41] + mi := &file_product_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1935,7 +2385,7 @@ func (x *QueryRandomSearchResultRequest) String() string { func (*QueryRandomSearchResultRequest) ProtoMessage() {} func (x *QueryRandomSearchResultRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[41] + mi := &file_product_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1948,7 +2398,7 @@ func (x *QueryRandomSearchResultRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomSearchResultRequest.ProtoReflect.Descriptor instead. func (*QueryRandomSearchResultRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{41} + return file_product_proto_rawDescGZIP(), []int{51} } // Response message for randomSearchResult operation. @@ -1961,7 +2411,7 @@ type QueryRandomSearchResultResponse struct { func (x *QueryRandomSearchResultResponse) Reset() { *x = QueryRandomSearchResultResponse{} - mi := &file_product_proto_msgTypes[42] + mi := &file_product_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1973,7 +2423,7 @@ func (x *QueryRandomSearchResultResponse) String() string { func (*QueryRandomSearchResultResponse) ProtoMessage() {} func (x *QueryRandomSearchResultResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[42] + mi := &file_product_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1986,7 +2436,7 @@ func (x *QueryRandomSearchResultResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRandomSearchResultResponse.ProtoReflect.Descriptor instead. func (*QueryRandomSearchResultResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{42} + return file_product_proto_rawDescGZIP(), []int{52} } func (x *QueryRandomSearchResultResponse) GetRandomSearchResult() *SearchResult { @@ -2005,7 +2455,7 @@ type QueryNullableFieldsTypeRequest struct { func (x *QueryNullableFieldsTypeRequest) Reset() { *x = QueryNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[43] + mi := &file_product_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2017,7 +2467,7 @@ func (x *QueryNullableFieldsTypeRequest) String() string { func (*QueryNullableFieldsTypeRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[43] + mi := &file_product_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2030,7 +2480,7 @@ func (x *QueryNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{43} + return file_product_proto_rawDescGZIP(), []int{53} } // Response message for nullableFieldsType operation. @@ -2043,7 +2493,7 @@ type QueryNullableFieldsTypeResponse struct { func (x *QueryNullableFieldsTypeResponse) Reset() { *x = QueryNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[44] + mi := &file_product_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2055,7 +2505,7 @@ func (x *QueryNullableFieldsTypeResponse) String() string { func (*QueryNullableFieldsTypeResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[44] + mi := &file_product_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2068,7 +2518,7 @@ func (x *QueryNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{44} + return file_product_proto_rawDescGZIP(), []int{54} } func (x *QueryNullableFieldsTypeResponse) GetNullableFieldsType() *NullableFieldsType { @@ -2088,7 +2538,7 @@ type QueryNullableFieldsTypeByIdRequest struct { func (x *QueryNullableFieldsTypeByIdRequest) Reset() { *x = QueryNullableFieldsTypeByIdRequest{} - mi := &file_product_proto_msgTypes[45] + mi := &file_product_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2100,7 +2550,7 @@ func (x *QueryNullableFieldsTypeByIdRequest) String() string { func (*QueryNullableFieldsTypeByIdRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[45] + mi := &file_product_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2113,7 +2563,7 @@ func (x *QueryNullableFieldsTypeByIdRequest) ProtoReflect() protoreflect.Message // Deprecated: Use QueryNullableFieldsTypeByIdRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{45} + return file_product_proto_rawDescGZIP(), []int{55} } func (x *QueryNullableFieldsTypeByIdRequest) GetId() string { @@ -2133,7 +2583,7 @@ type QueryNullableFieldsTypeByIdResponse struct { func (x *QueryNullableFieldsTypeByIdResponse) Reset() { *x = QueryNullableFieldsTypeByIdResponse{} - mi := &file_product_proto_msgTypes[46] + mi := &file_product_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2145,7 +2595,7 @@ func (x *QueryNullableFieldsTypeByIdResponse) String() string { func (*QueryNullableFieldsTypeByIdResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[46] + mi := &file_product_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2158,7 +2608,7 @@ func (x *QueryNullableFieldsTypeByIdResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryNullableFieldsTypeByIdResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{46} + return file_product_proto_rawDescGZIP(), []int{56} } func (x *QueryNullableFieldsTypeByIdResponse) GetNullableFieldsTypeById() *NullableFieldsType { @@ -2178,7 +2628,7 @@ type QueryNullableFieldsTypeWithFilterRequest struct { func (x *QueryNullableFieldsTypeWithFilterRequest) Reset() { *x = QueryNullableFieldsTypeWithFilterRequest{} - mi := &file_product_proto_msgTypes[47] + mi := &file_product_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2190,7 +2640,7 @@ func (x *QueryNullableFieldsTypeWithFilterRequest) String() string { func (*QueryNullableFieldsTypeWithFilterRequest) ProtoMessage() {} func (x *QueryNullableFieldsTypeWithFilterRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[47] + mi := &file_product_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2203,7 +2653,7 @@ func (x *QueryNullableFieldsTypeWithFilterRequest) ProtoReflect() protoreflect.M // Deprecated: Use QueryNullableFieldsTypeWithFilterRequest.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeWithFilterRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{47} + return file_product_proto_rawDescGZIP(), []int{57} } func (x *QueryNullableFieldsTypeWithFilterRequest) GetFilter() *NullableFieldsFilter { @@ -2223,7 +2673,7 @@ type QueryNullableFieldsTypeWithFilterResponse struct { func (x *QueryNullableFieldsTypeWithFilterResponse) Reset() { *x = QueryNullableFieldsTypeWithFilterResponse{} - mi := &file_product_proto_msgTypes[48] + mi := &file_product_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2235,7 +2685,7 @@ func (x *QueryNullableFieldsTypeWithFilterResponse) String() string { func (*QueryNullableFieldsTypeWithFilterResponse) ProtoMessage() {} func (x *QueryNullableFieldsTypeWithFilterResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[48] + mi := &file_product_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2248,7 +2698,7 @@ func (x *QueryNullableFieldsTypeWithFilterResponse) ProtoReflect() protoreflect. // Deprecated: Use QueryNullableFieldsTypeWithFilterResponse.ProtoReflect.Descriptor instead. func (*QueryNullableFieldsTypeWithFilterResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{48} + return file_product_proto_rawDescGZIP(), []int{58} } func (x *QueryNullableFieldsTypeWithFilterResponse) GetNullableFieldsTypeWithFilter() []*NullableFieldsType { @@ -2267,7 +2717,7 @@ type QueryAllNullableFieldsTypesRequest struct { func (x *QueryAllNullableFieldsTypesRequest) Reset() { *x = QueryAllNullableFieldsTypesRequest{} - mi := &file_product_proto_msgTypes[49] + mi := &file_product_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2279,7 +2729,7 @@ func (x *QueryAllNullableFieldsTypesRequest) String() string { func (*QueryAllNullableFieldsTypesRequest) ProtoMessage() {} func (x *QueryAllNullableFieldsTypesRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[49] + mi := &file_product_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2292,7 +2742,7 @@ func (x *QueryAllNullableFieldsTypesRequest) ProtoReflect() protoreflect.Message // Deprecated: Use QueryAllNullableFieldsTypesRequest.ProtoReflect.Descriptor instead. func (*QueryAllNullableFieldsTypesRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{49} + return file_product_proto_rawDescGZIP(), []int{59} } // Response message for allNullableFieldsTypes operation. @@ -2305,7 +2755,7 @@ type QueryAllNullableFieldsTypesResponse struct { func (x *QueryAllNullableFieldsTypesResponse) Reset() { *x = QueryAllNullableFieldsTypesResponse{} - mi := &file_product_proto_msgTypes[50] + mi := &file_product_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2317,7 +2767,7 @@ func (x *QueryAllNullableFieldsTypesResponse) String() string { func (*QueryAllNullableFieldsTypesResponse) ProtoMessage() {} func (x *QueryAllNullableFieldsTypesResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[50] + mi := &file_product_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2330,7 +2780,7 @@ func (x *QueryAllNullableFieldsTypesResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use QueryAllNullableFieldsTypesResponse.ProtoReflect.Descriptor instead. func (*QueryAllNullableFieldsTypesResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{50} + return file_product_proto_rawDescGZIP(), []int{60} } func (x *QueryAllNullableFieldsTypesResponse) GetAllNullableFieldsTypes() []*NullableFieldsType { @@ -2349,7 +2799,7 @@ type QueryBlogPostRequest struct { func (x *QueryBlogPostRequest) Reset() { *x = QueryBlogPostRequest{} - mi := &file_product_proto_msgTypes[51] + mi := &file_product_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2361,7 +2811,7 @@ func (x *QueryBlogPostRequest) String() string { func (*QueryBlogPostRequest) ProtoMessage() {} func (x *QueryBlogPostRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[51] + mi := &file_product_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2374,7 +2824,7 @@ func (x *QueryBlogPostRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryBlogPostRequest.ProtoReflect.Descriptor instead. func (*QueryBlogPostRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{51} + return file_product_proto_rawDescGZIP(), []int{61} } // Response message for blogPost operation. @@ -2387,7 +2837,7 @@ type QueryBlogPostResponse struct { func (x *QueryBlogPostResponse) Reset() { *x = QueryBlogPostResponse{} - mi := &file_product_proto_msgTypes[52] + mi := &file_product_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2399,7 +2849,7 @@ func (x *QueryBlogPostResponse) String() string { func (*QueryBlogPostResponse) ProtoMessage() {} func (x *QueryBlogPostResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[52] + mi := &file_product_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2412,7 +2862,7 @@ func (x *QueryBlogPostResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryBlogPostResponse.ProtoReflect.Descriptor instead. func (*QueryBlogPostResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{52} + return file_product_proto_rawDescGZIP(), []int{62} } func (x *QueryBlogPostResponse) GetBlogPost() *BlogPost { @@ -2432,7 +2882,7 @@ type QueryBlogPostByIdRequest struct { func (x *QueryBlogPostByIdRequest) Reset() { *x = QueryBlogPostByIdRequest{} - mi := &file_product_proto_msgTypes[53] + mi := &file_product_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2444,7 +2894,7 @@ func (x *QueryBlogPostByIdRequest) String() string { func (*QueryBlogPostByIdRequest) ProtoMessage() {} func (x *QueryBlogPostByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[53] + mi := &file_product_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2457,7 +2907,7 @@ func (x *QueryBlogPostByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryBlogPostByIdRequest.ProtoReflect.Descriptor instead. func (*QueryBlogPostByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{53} + return file_product_proto_rawDescGZIP(), []int{63} } func (x *QueryBlogPostByIdRequest) GetId() string { @@ -2477,7 +2927,7 @@ type QueryBlogPostByIdResponse struct { func (x *QueryBlogPostByIdResponse) Reset() { *x = QueryBlogPostByIdResponse{} - mi := &file_product_proto_msgTypes[54] + mi := &file_product_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2489,7 +2939,7 @@ func (x *QueryBlogPostByIdResponse) String() string { func (*QueryBlogPostByIdResponse) ProtoMessage() {} func (x *QueryBlogPostByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[54] + mi := &file_product_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2502,7 +2952,7 @@ func (x *QueryBlogPostByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryBlogPostByIdResponse.ProtoReflect.Descriptor instead. func (*QueryBlogPostByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{54} + return file_product_proto_rawDescGZIP(), []int{64} } func (x *QueryBlogPostByIdResponse) GetBlogPostById() *BlogPost { @@ -2522,7 +2972,7 @@ type QueryBlogPostsWithFilterRequest struct { func (x *QueryBlogPostsWithFilterRequest) Reset() { *x = QueryBlogPostsWithFilterRequest{} - mi := &file_product_proto_msgTypes[55] + mi := &file_product_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2534,7 +2984,7 @@ func (x *QueryBlogPostsWithFilterRequest) String() string { func (*QueryBlogPostsWithFilterRequest) ProtoMessage() {} func (x *QueryBlogPostsWithFilterRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[55] + mi := &file_product_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2547,7 +2997,7 @@ func (x *QueryBlogPostsWithFilterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryBlogPostsWithFilterRequest.ProtoReflect.Descriptor instead. func (*QueryBlogPostsWithFilterRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{55} + return file_product_proto_rawDescGZIP(), []int{65} } func (x *QueryBlogPostsWithFilterRequest) GetFilter() *BlogPostFilter { @@ -2567,7 +3017,7 @@ type QueryBlogPostsWithFilterResponse struct { func (x *QueryBlogPostsWithFilterResponse) Reset() { *x = QueryBlogPostsWithFilterResponse{} - mi := &file_product_proto_msgTypes[56] + mi := &file_product_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2579,7 +3029,7 @@ func (x *QueryBlogPostsWithFilterResponse) String() string { func (*QueryBlogPostsWithFilterResponse) ProtoMessage() {} func (x *QueryBlogPostsWithFilterResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[56] + mi := &file_product_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2592,7 +3042,7 @@ func (x *QueryBlogPostsWithFilterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryBlogPostsWithFilterResponse.ProtoReflect.Descriptor instead. func (*QueryBlogPostsWithFilterResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{56} + return file_product_proto_rawDescGZIP(), []int{66} } func (x *QueryBlogPostsWithFilterResponse) GetBlogPostsWithFilter() []*BlogPost { @@ -2611,7 +3061,7 @@ type QueryAllBlogPostsRequest struct { func (x *QueryAllBlogPostsRequest) Reset() { *x = QueryAllBlogPostsRequest{} - mi := &file_product_proto_msgTypes[57] + mi := &file_product_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2623,7 +3073,7 @@ func (x *QueryAllBlogPostsRequest) String() string { func (*QueryAllBlogPostsRequest) ProtoMessage() {} func (x *QueryAllBlogPostsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[57] + mi := &file_product_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2636,7 +3086,7 @@ func (x *QueryAllBlogPostsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllBlogPostsRequest.ProtoReflect.Descriptor instead. func (*QueryAllBlogPostsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{57} + return file_product_proto_rawDescGZIP(), []int{67} } // Response message for allBlogPosts operation. @@ -2649,7 +3099,7 @@ type QueryAllBlogPostsResponse struct { func (x *QueryAllBlogPostsResponse) Reset() { *x = QueryAllBlogPostsResponse{} - mi := &file_product_proto_msgTypes[58] + mi := &file_product_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2661,7 +3111,7 @@ func (x *QueryAllBlogPostsResponse) String() string { func (*QueryAllBlogPostsResponse) ProtoMessage() {} func (x *QueryAllBlogPostsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[58] + mi := &file_product_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2674,7 +3124,7 @@ func (x *QueryAllBlogPostsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllBlogPostsResponse.ProtoReflect.Descriptor instead. func (*QueryAllBlogPostsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{58} + return file_product_proto_rawDescGZIP(), []int{68} } func (x *QueryAllBlogPostsResponse) GetAllBlogPosts() []*BlogPost { @@ -2693,7 +3143,7 @@ type QueryAuthorRequest struct { func (x *QueryAuthorRequest) Reset() { *x = QueryAuthorRequest{} - mi := &file_product_proto_msgTypes[59] + mi := &file_product_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2705,7 +3155,7 @@ func (x *QueryAuthorRequest) String() string { func (*QueryAuthorRequest) ProtoMessage() {} func (x *QueryAuthorRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[59] + mi := &file_product_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2718,7 +3168,7 @@ func (x *QueryAuthorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAuthorRequest.ProtoReflect.Descriptor instead. func (*QueryAuthorRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{59} + return file_product_proto_rawDescGZIP(), []int{69} } // Response message for author operation. @@ -2731,7 +3181,7 @@ type QueryAuthorResponse struct { func (x *QueryAuthorResponse) Reset() { *x = QueryAuthorResponse{} - mi := &file_product_proto_msgTypes[60] + mi := &file_product_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2743,7 +3193,7 @@ func (x *QueryAuthorResponse) String() string { func (*QueryAuthorResponse) ProtoMessage() {} func (x *QueryAuthorResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[60] + mi := &file_product_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2756,7 +3206,7 @@ func (x *QueryAuthorResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAuthorResponse.ProtoReflect.Descriptor instead. func (*QueryAuthorResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{60} + return file_product_proto_rawDescGZIP(), []int{70} } func (x *QueryAuthorResponse) GetAuthor() *Author { @@ -2776,7 +3226,7 @@ type QueryAuthorByIdRequest struct { func (x *QueryAuthorByIdRequest) Reset() { *x = QueryAuthorByIdRequest{} - mi := &file_product_proto_msgTypes[61] + mi := &file_product_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2788,7 +3238,7 @@ func (x *QueryAuthorByIdRequest) String() string { func (*QueryAuthorByIdRequest) ProtoMessage() {} func (x *QueryAuthorByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[61] + mi := &file_product_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2801,7 +3251,7 @@ func (x *QueryAuthorByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAuthorByIdRequest.ProtoReflect.Descriptor instead. func (*QueryAuthorByIdRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{61} + return file_product_proto_rawDescGZIP(), []int{71} } func (x *QueryAuthorByIdRequest) GetId() string { @@ -2821,7 +3271,7 @@ type QueryAuthorByIdResponse struct { func (x *QueryAuthorByIdResponse) Reset() { *x = QueryAuthorByIdResponse{} - mi := &file_product_proto_msgTypes[62] + mi := &file_product_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2833,7 +3283,7 @@ func (x *QueryAuthorByIdResponse) String() string { func (*QueryAuthorByIdResponse) ProtoMessage() {} func (x *QueryAuthorByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[62] + mi := &file_product_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2846,7 +3296,7 @@ func (x *QueryAuthorByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAuthorByIdResponse.ProtoReflect.Descriptor instead. func (*QueryAuthorByIdResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{62} + return file_product_proto_rawDescGZIP(), []int{72} } func (x *QueryAuthorByIdResponse) GetAuthorById() *Author { @@ -2866,7 +3316,7 @@ type QueryAuthorsWithFilterRequest struct { func (x *QueryAuthorsWithFilterRequest) Reset() { *x = QueryAuthorsWithFilterRequest{} - mi := &file_product_proto_msgTypes[63] + mi := &file_product_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2878,7 +3328,7 @@ func (x *QueryAuthorsWithFilterRequest) String() string { func (*QueryAuthorsWithFilterRequest) ProtoMessage() {} func (x *QueryAuthorsWithFilterRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[63] + mi := &file_product_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2891,7 +3341,7 @@ func (x *QueryAuthorsWithFilterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAuthorsWithFilterRequest.ProtoReflect.Descriptor instead. func (*QueryAuthorsWithFilterRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{63} + return file_product_proto_rawDescGZIP(), []int{73} } func (x *QueryAuthorsWithFilterRequest) GetFilter() *AuthorFilter { @@ -2911,7 +3361,7 @@ type QueryAuthorsWithFilterResponse struct { func (x *QueryAuthorsWithFilterResponse) Reset() { *x = QueryAuthorsWithFilterResponse{} - mi := &file_product_proto_msgTypes[64] + mi := &file_product_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2923,7 +3373,7 @@ func (x *QueryAuthorsWithFilterResponse) String() string { func (*QueryAuthorsWithFilterResponse) ProtoMessage() {} func (x *QueryAuthorsWithFilterResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[64] + mi := &file_product_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2936,7 +3386,7 @@ func (x *QueryAuthorsWithFilterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAuthorsWithFilterResponse.ProtoReflect.Descriptor instead. func (*QueryAuthorsWithFilterResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{64} + return file_product_proto_rawDescGZIP(), []int{74} } func (x *QueryAuthorsWithFilterResponse) GetAuthorsWithFilter() []*Author { @@ -2955,7 +3405,7 @@ type QueryAllAuthorsRequest struct { func (x *QueryAllAuthorsRequest) Reset() { *x = QueryAllAuthorsRequest{} - mi := &file_product_proto_msgTypes[65] + mi := &file_product_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2967,7 +3417,7 @@ func (x *QueryAllAuthorsRequest) String() string { func (*QueryAllAuthorsRequest) ProtoMessage() {} func (x *QueryAllAuthorsRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[65] + mi := &file_product_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2980,7 +3430,7 @@ func (x *QueryAllAuthorsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllAuthorsRequest.ProtoReflect.Descriptor instead. func (*QueryAllAuthorsRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{65} + return file_product_proto_rawDescGZIP(), []int{75} } // Response message for allAuthors operation. @@ -2993,7 +3443,7 @@ type QueryAllAuthorsResponse struct { func (x *QueryAllAuthorsResponse) Reset() { *x = QueryAllAuthorsResponse{} - mi := &file_product_proto_msgTypes[66] + mi := &file_product_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3005,7 +3455,7 @@ func (x *QueryAllAuthorsResponse) String() string { func (*QueryAllAuthorsResponse) ProtoMessage() {} func (x *QueryAllAuthorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[66] + mi := &file_product_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3018,7 +3468,7 @@ func (x *QueryAllAuthorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryAllAuthorsResponse.ProtoReflect.Descriptor instead. func (*QueryAllAuthorsResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{66} + return file_product_proto_rawDescGZIP(), []int{76} } func (x *QueryAllAuthorsResponse) GetAllAuthors() []*Author { @@ -3038,7 +3488,7 @@ type MutationCreateUserRequest struct { func (x *MutationCreateUserRequest) Reset() { *x = MutationCreateUserRequest{} - mi := &file_product_proto_msgTypes[67] + mi := &file_product_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3050,7 +3500,7 @@ func (x *MutationCreateUserRequest) String() string { func (*MutationCreateUserRequest) ProtoMessage() {} func (x *MutationCreateUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[67] + mi := &file_product_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3063,7 +3513,7 @@ func (x *MutationCreateUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationCreateUserRequest.ProtoReflect.Descriptor instead. func (*MutationCreateUserRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{67} + return file_product_proto_rawDescGZIP(), []int{77} } func (x *MutationCreateUserRequest) GetInput() *UserInput { @@ -3083,7 +3533,7 @@ type MutationCreateUserResponse struct { func (x *MutationCreateUserResponse) Reset() { *x = MutationCreateUserResponse{} - mi := &file_product_proto_msgTypes[68] + mi := &file_product_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3095,7 +3545,7 @@ func (x *MutationCreateUserResponse) String() string { func (*MutationCreateUserResponse) ProtoMessage() {} func (x *MutationCreateUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[68] + mi := &file_product_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3108,7 +3558,7 @@ func (x *MutationCreateUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationCreateUserResponse.ProtoReflect.Descriptor instead. func (*MutationCreateUserResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{68} + return file_product_proto_rawDescGZIP(), []int{78} } func (x *MutationCreateUserResponse) GetCreateUser() *User { @@ -3128,7 +3578,7 @@ type MutationPerformActionRequest struct { func (x *MutationPerformActionRequest) Reset() { *x = MutationPerformActionRequest{} - mi := &file_product_proto_msgTypes[69] + mi := &file_product_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3140,7 +3590,7 @@ func (x *MutationPerformActionRequest) String() string { func (*MutationPerformActionRequest) ProtoMessage() {} func (x *MutationPerformActionRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[69] + mi := &file_product_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3153,7 +3603,7 @@ func (x *MutationPerformActionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationPerformActionRequest.ProtoReflect.Descriptor instead. func (*MutationPerformActionRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{69} + return file_product_proto_rawDescGZIP(), []int{79} } func (x *MutationPerformActionRequest) GetInput() *ActionInput { @@ -3173,7 +3623,7 @@ type MutationPerformActionResponse struct { func (x *MutationPerformActionResponse) Reset() { *x = MutationPerformActionResponse{} - mi := &file_product_proto_msgTypes[70] + mi := &file_product_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3185,7 +3635,7 @@ func (x *MutationPerformActionResponse) String() string { func (*MutationPerformActionResponse) ProtoMessage() {} func (x *MutationPerformActionResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[70] + mi := &file_product_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3198,7 +3648,7 @@ func (x *MutationPerformActionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationPerformActionResponse.ProtoReflect.Descriptor instead. func (*MutationPerformActionResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{70} + return file_product_proto_rawDescGZIP(), []int{80} } func (x *MutationPerformActionResponse) GetPerformAction() *ActionResult { @@ -3218,7 +3668,7 @@ type MutationCreateNullableFieldsTypeRequest struct { func (x *MutationCreateNullableFieldsTypeRequest) Reset() { *x = MutationCreateNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[71] + mi := &file_product_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3230,7 +3680,7 @@ func (x *MutationCreateNullableFieldsTypeRequest) String() string { func (*MutationCreateNullableFieldsTypeRequest) ProtoMessage() {} func (x *MutationCreateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[71] + mi := &file_product_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3243,7 +3693,7 @@ func (x *MutationCreateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Me // Deprecated: Use MutationCreateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. func (*MutationCreateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{71} + return file_product_proto_rawDescGZIP(), []int{81} } func (x *MutationCreateNullableFieldsTypeRequest) GetInput() *NullableFieldsInput { @@ -3263,7 +3713,7 @@ type MutationCreateNullableFieldsTypeResponse struct { func (x *MutationCreateNullableFieldsTypeResponse) Reset() { *x = MutationCreateNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[72] + mi := &file_product_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3275,7 +3725,7 @@ func (x *MutationCreateNullableFieldsTypeResponse) String() string { func (*MutationCreateNullableFieldsTypeResponse) ProtoMessage() {} func (x *MutationCreateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[72] + mi := &file_product_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3288,7 +3738,7 @@ func (x *MutationCreateNullableFieldsTypeResponse) ProtoReflect() protoreflect.M // Deprecated: Use MutationCreateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. func (*MutationCreateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{72} + return file_product_proto_rawDescGZIP(), []int{82} } func (x *MutationCreateNullableFieldsTypeResponse) GetCreateNullableFieldsType() *NullableFieldsType { @@ -3309,7 +3759,7 @@ type MutationUpdateNullableFieldsTypeRequest struct { func (x *MutationUpdateNullableFieldsTypeRequest) Reset() { *x = MutationUpdateNullableFieldsTypeRequest{} - mi := &file_product_proto_msgTypes[73] + mi := &file_product_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3321,7 +3771,7 @@ func (x *MutationUpdateNullableFieldsTypeRequest) String() string { func (*MutationUpdateNullableFieldsTypeRequest) ProtoMessage() {} func (x *MutationUpdateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[73] + mi := &file_product_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3334,7 +3784,7 @@ func (x *MutationUpdateNullableFieldsTypeRequest) ProtoReflect() protoreflect.Me // Deprecated: Use MutationUpdateNullableFieldsTypeRequest.ProtoReflect.Descriptor instead. func (*MutationUpdateNullableFieldsTypeRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{73} + return file_product_proto_rawDescGZIP(), []int{83} } func (x *MutationUpdateNullableFieldsTypeRequest) GetId() string { @@ -3361,7 +3811,7 @@ type MutationUpdateNullableFieldsTypeResponse struct { func (x *MutationUpdateNullableFieldsTypeResponse) Reset() { *x = MutationUpdateNullableFieldsTypeResponse{} - mi := &file_product_proto_msgTypes[74] + mi := &file_product_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3373,7 +3823,7 @@ func (x *MutationUpdateNullableFieldsTypeResponse) String() string { func (*MutationUpdateNullableFieldsTypeResponse) ProtoMessage() {} func (x *MutationUpdateNullableFieldsTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[74] + mi := &file_product_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3386,7 +3836,7 @@ func (x *MutationUpdateNullableFieldsTypeResponse) ProtoReflect() protoreflect.M // Deprecated: Use MutationUpdateNullableFieldsTypeResponse.ProtoReflect.Descriptor instead. func (*MutationUpdateNullableFieldsTypeResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{74} + return file_product_proto_rawDescGZIP(), []int{84} } func (x *MutationUpdateNullableFieldsTypeResponse) GetUpdateNullableFieldsType() *NullableFieldsType { @@ -3406,7 +3856,7 @@ type MutationCreateBlogPostRequest struct { func (x *MutationCreateBlogPostRequest) Reset() { *x = MutationCreateBlogPostRequest{} - mi := &file_product_proto_msgTypes[75] + mi := &file_product_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3418,7 +3868,7 @@ func (x *MutationCreateBlogPostRequest) String() string { func (*MutationCreateBlogPostRequest) ProtoMessage() {} func (x *MutationCreateBlogPostRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[75] + mi := &file_product_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3431,7 +3881,7 @@ func (x *MutationCreateBlogPostRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationCreateBlogPostRequest.ProtoReflect.Descriptor instead. func (*MutationCreateBlogPostRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{75} + return file_product_proto_rawDescGZIP(), []int{85} } func (x *MutationCreateBlogPostRequest) GetInput() *BlogPostInput { @@ -3451,7 +3901,7 @@ type MutationCreateBlogPostResponse struct { func (x *MutationCreateBlogPostResponse) Reset() { *x = MutationCreateBlogPostResponse{} - mi := &file_product_proto_msgTypes[76] + mi := &file_product_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3463,7 +3913,7 @@ func (x *MutationCreateBlogPostResponse) String() string { func (*MutationCreateBlogPostResponse) ProtoMessage() {} func (x *MutationCreateBlogPostResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[76] + mi := &file_product_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3476,7 +3926,7 @@ func (x *MutationCreateBlogPostResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationCreateBlogPostResponse.ProtoReflect.Descriptor instead. func (*MutationCreateBlogPostResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{76} + return file_product_proto_rawDescGZIP(), []int{86} } func (x *MutationCreateBlogPostResponse) GetCreateBlogPost() *BlogPost { @@ -3497,7 +3947,7 @@ type MutationUpdateBlogPostRequest struct { func (x *MutationUpdateBlogPostRequest) Reset() { *x = MutationUpdateBlogPostRequest{} - mi := &file_product_proto_msgTypes[77] + mi := &file_product_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3509,7 +3959,7 @@ func (x *MutationUpdateBlogPostRequest) String() string { func (*MutationUpdateBlogPostRequest) ProtoMessage() {} func (x *MutationUpdateBlogPostRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[77] + mi := &file_product_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3522,7 +3972,7 @@ func (x *MutationUpdateBlogPostRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationUpdateBlogPostRequest.ProtoReflect.Descriptor instead. func (*MutationUpdateBlogPostRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{77} + return file_product_proto_rawDescGZIP(), []int{87} } func (x *MutationUpdateBlogPostRequest) GetId() string { @@ -3549,7 +3999,7 @@ type MutationUpdateBlogPostResponse struct { func (x *MutationUpdateBlogPostResponse) Reset() { *x = MutationUpdateBlogPostResponse{} - mi := &file_product_proto_msgTypes[78] + mi := &file_product_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3561,7 +4011,7 @@ func (x *MutationUpdateBlogPostResponse) String() string { func (*MutationUpdateBlogPostResponse) ProtoMessage() {} func (x *MutationUpdateBlogPostResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[78] + mi := &file_product_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3574,7 +4024,7 @@ func (x *MutationUpdateBlogPostResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationUpdateBlogPostResponse.ProtoReflect.Descriptor instead. func (*MutationUpdateBlogPostResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{78} + return file_product_proto_rawDescGZIP(), []int{88} } func (x *MutationUpdateBlogPostResponse) GetUpdateBlogPost() *BlogPost { @@ -3594,7 +4044,7 @@ type MutationCreateAuthorRequest struct { func (x *MutationCreateAuthorRequest) Reset() { *x = MutationCreateAuthorRequest{} - mi := &file_product_proto_msgTypes[79] + mi := &file_product_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3606,7 +4056,7 @@ func (x *MutationCreateAuthorRequest) String() string { func (*MutationCreateAuthorRequest) ProtoMessage() {} func (x *MutationCreateAuthorRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[79] + mi := &file_product_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3619,7 +4069,7 @@ func (x *MutationCreateAuthorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationCreateAuthorRequest.ProtoReflect.Descriptor instead. func (*MutationCreateAuthorRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{79} + return file_product_proto_rawDescGZIP(), []int{89} } func (x *MutationCreateAuthorRequest) GetInput() *AuthorInput { @@ -3639,7 +4089,7 @@ type MutationCreateAuthorResponse struct { func (x *MutationCreateAuthorResponse) Reset() { *x = MutationCreateAuthorResponse{} - mi := &file_product_proto_msgTypes[80] + mi := &file_product_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3651,7 +4101,7 @@ func (x *MutationCreateAuthorResponse) String() string { func (*MutationCreateAuthorResponse) ProtoMessage() {} func (x *MutationCreateAuthorResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[80] + mi := &file_product_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3664,7 +4114,7 @@ func (x *MutationCreateAuthorResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationCreateAuthorResponse.ProtoReflect.Descriptor instead. func (*MutationCreateAuthorResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{80} + return file_product_proto_rawDescGZIP(), []int{90} } func (x *MutationCreateAuthorResponse) GetCreateAuthor() *Author { @@ -3685,7 +4135,7 @@ type MutationUpdateAuthorRequest struct { func (x *MutationUpdateAuthorRequest) Reset() { *x = MutationUpdateAuthorRequest{} - mi := &file_product_proto_msgTypes[81] + mi := &file_product_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3697,7 +4147,7 @@ func (x *MutationUpdateAuthorRequest) String() string { func (*MutationUpdateAuthorRequest) ProtoMessage() {} func (x *MutationUpdateAuthorRequest) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[81] + mi := &file_product_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3710,7 +4160,7 @@ func (x *MutationUpdateAuthorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationUpdateAuthorRequest.ProtoReflect.Descriptor instead. func (*MutationUpdateAuthorRequest) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{81} + return file_product_proto_rawDescGZIP(), []int{91} } func (x *MutationUpdateAuthorRequest) GetId() string { @@ -3737,7 +4187,7 @@ type MutationUpdateAuthorResponse struct { func (x *MutationUpdateAuthorResponse) Reset() { *x = MutationUpdateAuthorResponse{} - mi := &file_product_proto_msgTypes[82] + mi := &file_product_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3749,7 +4199,7 @@ func (x *MutationUpdateAuthorResponse) String() string { func (*MutationUpdateAuthorResponse) ProtoMessage() {} func (x *MutationUpdateAuthorResponse) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[82] + mi := &file_product_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3762,7 +4212,7 @@ func (x *MutationUpdateAuthorResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MutationUpdateAuthorResponse.ProtoReflect.Descriptor instead. func (*MutationUpdateAuthorResponse) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{82} + return file_product_proto_rawDescGZIP(), []int{92} } func (x *MutationUpdateAuthorResponse) GetUpdateAuthor() *Author { @@ -3783,7 +4233,7 @@ type Product struct { func (x *Product) Reset() { *x = Product{} - mi := &file_product_proto_msgTypes[83] + mi := &file_product_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3795,7 +4245,7 @@ func (x *Product) String() string { func (*Product) ProtoMessage() {} func (x *Product) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[83] + mi := &file_product_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3808,7 +4258,7 @@ func (x *Product) ProtoReflect() protoreflect.Message { // Deprecated: Use Product.ProtoReflect.Descriptor instead. func (*Product) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{83} + return file_product_proto_rawDescGZIP(), []int{93} } func (x *Product) GetId() string { @@ -3843,7 +4293,7 @@ type Storage struct { func (x *Storage) Reset() { *x = Storage{} - mi := &file_product_proto_msgTypes[84] + mi := &file_product_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3855,7 +4305,7 @@ func (x *Storage) String() string { func (*Storage) ProtoMessage() {} func (x *Storage) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[84] + mi := &file_product_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3868,7 +4318,7 @@ func (x *Storage) ProtoReflect() protoreflect.Message { // Deprecated: Use Storage.ProtoReflect.Descriptor instead. func (*Storage) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{84} + return file_product_proto_rawDescGZIP(), []int{94} } func (x *Storage) GetId() string { @@ -3902,7 +4352,7 @@ type User struct { func (x *User) Reset() { *x = User{} - mi := &file_product_proto_msgTypes[85] + mi := &file_product_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3914,7 +4364,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[85] + mi := &file_product_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3927,7 +4377,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{85} + return file_product_proto_rawDescGZIP(), []int{95} } func (x *User) GetId() string { @@ -3955,7 +4405,7 @@ type NestedTypeA struct { func (x *NestedTypeA) Reset() { *x = NestedTypeA{} - mi := &file_product_proto_msgTypes[86] + mi := &file_product_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3967,7 +4417,7 @@ func (x *NestedTypeA) String() string { func (*NestedTypeA) ProtoMessage() {} func (x *NestedTypeA) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[86] + mi := &file_product_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3980,7 +4430,7 @@ func (x *NestedTypeA) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeA.ProtoReflect.Descriptor instead. func (*NestedTypeA) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{86} + return file_product_proto_rawDescGZIP(), []int{96} } func (x *NestedTypeA) GetId() string { @@ -4015,7 +4465,7 @@ type RecursiveType struct { func (x *RecursiveType) Reset() { *x = RecursiveType{} - mi := &file_product_proto_msgTypes[87] + mi := &file_product_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4027,7 +4477,7 @@ func (x *RecursiveType) String() string { func (*RecursiveType) ProtoMessage() {} func (x *RecursiveType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[87] + mi := &file_product_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4040,7 +4490,7 @@ func (x *RecursiveType) ProtoReflect() protoreflect.Message { // Deprecated: Use RecursiveType.ProtoReflect.Descriptor instead. func (*RecursiveType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{87} + return file_product_proto_rawDescGZIP(), []int{97} } func (x *RecursiveType) GetId() string { @@ -4076,7 +4526,7 @@ type TypeWithMultipleFilterFields struct { func (x *TypeWithMultipleFilterFields) Reset() { *x = TypeWithMultipleFilterFields{} - mi := &file_product_proto_msgTypes[88] + mi := &file_product_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4088,7 +4538,7 @@ func (x *TypeWithMultipleFilterFields) String() string { func (*TypeWithMultipleFilterFields) ProtoMessage() {} func (x *TypeWithMultipleFilterFields) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[88] + mi := &file_product_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4101,7 +4551,7 @@ func (x *TypeWithMultipleFilterFields) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeWithMultipleFilterFields.ProtoReflect.Descriptor instead. func (*TypeWithMultipleFilterFields) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{88} + return file_product_proto_rawDescGZIP(), []int{98} } func (x *TypeWithMultipleFilterFields) GetId() string { @@ -4142,7 +4592,7 @@ type FilterTypeInput struct { func (x *FilterTypeInput) Reset() { *x = FilterTypeInput{} - mi := &file_product_proto_msgTypes[89] + mi := &file_product_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4154,7 +4604,7 @@ func (x *FilterTypeInput) String() string { func (*FilterTypeInput) ProtoMessage() {} func (x *FilterTypeInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[89] + mi := &file_product_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4167,7 +4617,7 @@ func (x *FilterTypeInput) ProtoReflect() protoreflect.Message { // Deprecated: Use FilterTypeInput.ProtoReflect.Descriptor instead. func (*FilterTypeInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{89} + return file_product_proto_rawDescGZIP(), []int{99} } func (x *FilterTypeInput) GetFilterField_1() string { @@ -4193,7 +4643,7 @@ type ComplexFilterTypeInput struct { func (x *ComplexFilterTypeInput) Reset() { *x = ComplexFilterTypeInput{} - mi := &file_product_proto_msgTypes[90] + mi := &file_product_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4205,7 +4655,7 @@ func (x *ComplexFilterTypeInput) String() string { func (*ComplexFilterTypeInput) ProtoMessage() {} func (x *ComplexFilterTypeInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[90] + mi := &file_product_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4218,7 +4668,7 @@ func (x *ComplexFilterTypeInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ComplexFilterTypeInput.ProtoReflect.Descriptor instead. func (*ComplexFilterTypeInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{90} + return file_product_proto_rawDescGZIP(), []int{100} } func (x *ComplexFilterTypeInput) GetFilter() *FilterType { @@ -4238,7 +4688,7 @@ type TypeWithComplexFilterInput struct { func (x *TypeWithComplexFilterInput) Reset() { *x = TypeWithComplexFilterInput{} - mi := &file_product_proto_msgTypes[91] + mi := &file_product_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4250,7 +4700,7 @@ func (x *TypeWithComplexFilterInput) String() string { func (*TypeWithComplexFilterInput) ProtoMessage() {} func (x *TypeWithComplexFilterInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[91] + mi := &file_product_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4263,7 +4713,7 @@ func (x *TypeWithComplexFilterInput) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeWithComplexFilterInput.ProtoReflect.Descriptor instead. func (*TypeWithComplexFilterInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{91} + return file_product_proto_rawDescGZIP(), []int{101} } func (x *TypeWithComplexFilterInput) GetId() string { @@ -4291,7 +4741,7 @@ type OrderInput struct { func (x *OrderInput) Reset() { *x = OrderInput{} - mi := &file_product_proto_msgTypes[92] + mi := &file_product_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4303,7 +4753,7 @@ func (x *OrderInput) String() string { func (*OrderInput) ProtoMessage() {} func (x *OrderInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[92] + mi := &file_product_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4316,7 +4766,7 @@ func (x *OrderInput) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderInput.ProtoReflect.Descriptor instead. func (*OrderInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{92} + return file_product_proto_rawDescGZIP(), []int{102} } func (x *OrderInput) GetOrderId() string { @@ -4352,7 +4802,7 @@ type Order struct { func (x *Order) Reset() { *x = Order{} - mi := &file_product_proto_msgTypes[93] + mi := &file_product_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4364,7 +4814,7 @@ func (x *Order) String() string { func (*Order) ProtoMessage() {} func (x *Order) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[93] + mi := &file_product_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4377,7 +4827,7 @@ func (x *Order) ProtoReflect() protoreflect.Message { // Deprecated: Use Order.ProtoReflect.Descriptor instead. func (*Order) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{93} + return file_product_proto_rawDescGZIP(), []int{103} } func (x *Order) GetOrderId() string { @@ -4419,7 +4869,7 @@ type Category struct { func (x *Category) Reset() { *x = Category{} - mi := &file_product_proto_msgTypes[94] + mi := &file_product_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4431,7 +4881,7 @@ func (x *Category) String() string { func (*Category) ProtoMessage() {} func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[94] + mi := &file_product_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4444,7 +4894,7 @@ func (x *Category) ProtoReflect() protoreflect.Message { // Deprecated: Use Category.ProtoReflect.Descriptor instead. func (*Category) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{94} + return file_product_proto_rawDescGZIP(), []int{104} } func (x *Category) GetId() string { @@ -4478,7 +4928,7 @@ type CategoryFilter struct { func (x *CategoryFilter) Reset() { *x = CategoryFilter{} - mi := &file_product_proto_msgTypes[95] + mi := &file_product_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4490,7 +4940,7 @@ func (x *CategoryFilter) String() string { func (*CategoryFilter) ProtoMessage() {} func (x *CategoryFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[95] + mi := &file_product_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4503,7 +4953,7 @@ func (x *CategoryFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use CategoryFilter.ProtoReflect.Descriptor instead. func (*CategoryFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{95} + return file_product_proto_rawDescGZIP(), []int{105} } func (x *CategoryFilter) GetCategory() CategoryKind { @@ -4533,7 +4983,7 @@ type Animal struct { func (x *Animal) Reset() { *x = Animal{} - mi := &file_product_proto_msgTypes[96] + mi := &file_product_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4545,7 +4995,7 @@ func (x *Animal) String() string { func (*Animal) ProtoMessage() {} func (x *Animal) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[96] + mi := &file_product_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4558,7 +5008,7 @@ func (x *Animal) ProtoReflect() protoreflect.Message { // Deprecated: Use Animal.ProtoReflect.Descriptor instead. func (*Animal) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{96} + return file_product_proto_rawDescGZIP(), []int{106} } func (x *Animal) GetInstance() isAnimal_Instance { @@ -4612,7 +5062,7 @@ type SearchInput struct { func (x *SearchInput) Reset() { *x = SearchInput{} - mi := &file_product_proto_msgTypes[97] + mi := &file_product_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4624,7 +5074,7 @@ func (x *SearchInput) String() string { func (*SearchInput) ProtoMessage() {} func (x *SearchInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[97] + mi := &file_product_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4637,7 +5087,7 @@ func (x *SearchInput) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchInput.ProtoReflect.Descriptor instead. func (*SearchInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{97} + return file_product_proto_rawDescGZIP(), []int{107} } func (x *SearchInput) GetQuery() string { @@ -4668,7 +5118,7 @@ type SearchResult struct { func (x *SearchResult) Reset() { *x = SearchResult{} - mi := &file_product_proto_msgTypes[98] + mi := &file_product_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4680,7 +5130,7 @@ func (x *SearchResult) String() string { func (*SearchResult) ProtoMessage() {} func (x *SearchResult) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[98] + mi := &file_product_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4693,7 +5143,7 @@ func (x *SearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResult.ProtoReflect.Descriptor instead. func (*SearchResult) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{98} + return file_product_proto_rawDescGZIP(), []int{108} } func (x *SearchResult) GetValue() isSearchResult_Value { @@ -4768,7 +5218,7 @@ type NullableFieldsType struct { func (x *NullableFieldsType) Reset() { *x = NullableFieldsType{} - mi := &file_product_proto_msgTypes[99] + mi := &file_product_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4780,7 +5230,7 @@ func (x *NullableFieldsType) String() string { func (*NullableFieldsType) ProtoMessage() {} func (x *NullableFieldsType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[99] + mi := &file_product_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4793,7 +5243,7 @@ func (x *NullableFieldsType) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableFieldsType.ProtoReflect.Descriptor instead. func (*NullableFieldsType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{99} + return file_product_proto_rawDescGZIP(), []int{109} } func (x *NullableFieldsType) GetId() string { @@ -4863,7 +5313,7 @@ type NullableFieldsFilter struct { func (x *NullableFieldsFilter) Reset() { *x = NullableFieldsFilter{} - mi := &file_product_proto_msgTypes[100] + mi := &file_product_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4875,7 +5325,7 @@ func (x *NullableFieldsFilter) String() string { func (*NullableFieldsFilter) ProtoMessage() {} func (x *NullableFieldsFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[100] + mi := &file_product_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4888,7 +5338,7 @@ func (x *NullableFieldsFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableFieldsFilter.ProtoReflect.Descriptor instead. func (*NullableFieldsFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{100} + return file_product_proto_rawDescGZIP(), []int{110} } func (x *NullableFieldsFilter) GetName() *wrapperspb.StringValue { @@ -4913,28 +5363,34 @@ func (x *NullableFieldsFilter) GetIncludeNulls() *wrapperspb.BoolValue { } type BlogPost struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` - Tags []string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty"` - OptionalTags *ListOfString `protobuf:"bytes,5,opt,name=optional_tags,json=optionalTags,proto3" json:"optional_tags,omitempty"` - Categories []string `protobuf:"bytes,6,rep,name=categories,proto3" json:"categories,omitempty"` - Keywords *ListOfString `protobuf:"bytes,7,opt,name=keywords,proto3" json:"keywords,omitempty"` - ViewCounts []int32 `protobuf:"varint,8,rep,packed,name=view_counts,json=viewCounts,proto3" json:"view_counts,omitempty"` - Ratings *ListOfFloat `protobuf:"bytes,9,opt,name=ratings,proto3" json:"ratings,omitempty"` - IsPublished *ListOfBoolean `protobuf:"bytes,10,opt,name=is_published,json=isPublished,proto3" json:"is_published,omitempty"` - TagGroups *ListOfListOfString `protobuf:"bytes,11,opt,name=tag_groups,json=tagGroups,proto3" json:"tag_groups,omitempty"` - RelatedTopics *ListOfListOfString `protobuf:"bytes,12,opt,name=related_topics,json=relatedTopics,proto3" json:"related_topics,omitempty"` - CommentThreads *ListOfListOfString `protobuf:"bytes,13,opt,name=comment_threads,json=commentThreads,proto3" json:"comment_threads,omitempty"` - Suggestions *ListOfListOfString `protobuf:"bytes,14,opt,name=suggestions,proto3" json:"suggestions,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + Tags []string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty"` + OptionalTags *ListOfString `protobuf:"bytes,5,opt,name=optional_tags,json=optionalTags,proto3" json:"optional_tags,omitempty"` + Categories []string `protobuf:"bytes,6,rep,name=categories,proto3" json:"categories,omitempty"` + Keywords *ListOfString `protobuf:"bytes,7,opt,name=keywords,proto3" json:"keywords,omitempty"` + ViewCounts []int32 `protobuf:"varint,8,rep,packed,name=view_counts,json=viewCounts,proto3" json:"view_counts,omitempty"` + Ratings *ListOfFloat `protobuf:"bytes,9,opt,name=ratings,proto3" json:"ratings,omitempty"` + IsPublished *ListOfBoolean `protobuf:"bytes,10,opt,name=is_published,json=isPublished,proto3" json:"is_published,omitempty"` + TagGroups *ListOfListOfString `protobuf:"bytes,11,opt,name=tag_groups,json=tagGroups,proto3" json:"tag_groups,omitempty"` + RelatedTopics *ListOfListOfString `protobuf:"bytes,12,opt,name=related_topics,json=relatedTopics,proto3" json:"related_topics,omitempty"` + CommentThreads *ListOfListOfString `protobuf:"bytes,13,opt,name=comment_threads,json=commentThreads,proto3" json:"comment_threads,omitempty"` + Suggestions *ListOfListOfString `protobuf:"bytes,14,opt,name=suggestions,proto3" json:"suggestions,omitempty"` + RelatedCategories []*Category `protobuf:"bytes,15,rep,name=related_categories,json=relatedCategories,proto3" json:"related_categories,omitempty"` + Contributors []*User `protobuf:"bytes,16,rep,name=contributors,proto3" json:"contributors,omitempty"` + MentionedProducts *ListOfProduct `protobuf:"bytes,17,opt,name=mentioned_products,json=mentionedProducts,proto3" json:"mentioned_products,omitempty"` + MentionedUsers *ListOfUser `protobuf:"bytes,18,opt,name=mentioned_users,json=mentionedUsers,proto3" json:"mentioned_users,omitempty"` + CategoryGroups *ListOfListOfCategory `protobuf:"bytes,19,opt,name=category_groups,json=categoryGroups,proto3" json:"category_groups,omitempty"` + ContributorTeams *ListOfListOfUser `protobuf:"bytes,20,opt,name=contributor_teams,json=contributorTeams,proto3" json:"contributor_teams,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BlogPost) Reset() { *x = BlogPost{} - mi := &file_product_proto_msgTypes[101] + mi := &file_product_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4946,7 +5402,7 @@ func (x *BlogPost) String() string { func (*BlogPost) ProtoMessage() {} func (x *BlogPost) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[101] + mi := &file_product_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4959,7 +5415,7 @@ func (x *BlogPost) ProtoReflect() protoreflect.Message { // Deprecated: Use BlogPost.ProtoReflect.Descriptor instead. func (*BlogPost) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{101} + return file_product_proto_rawDescGZIP(), []int{111} } func (x *BlogPost) GetId() string { @@ -5060,6 +5516,48 @@ func (x *BlogPost) GetSuggestions() *ListOfListOfString { return nil } +func (x *BlogPost) GetRelatedCategories() []*Category { + if x != nil { + return x.RelatedCategories + } + return nil +} + +func (x *BlogPost) GetContributors() []*User { + if x != nil { + return x.Contributors + } + return nil +} + +func (x *BlogPost) GetMentionedProducts() *ListOfProduct { + if x != nil { + return x.MentionedProducts + } + return nil +} + +func (x *BlogPost) GetMentionedUsers() *ListOfUser { + if x != nil { + return x.MentionedUsers + } + return nil +} + +func (x *BlogPost) GetCategoryGroups() *ListOfListOfCategory { + if x != nil { + return x.CategoryGroups + } + return nil +} + +func (x *BlogPost) GetContributorTeams() *ListOfListOfUser { + if x != nil { + return x.ContributorTeams + } + return nil +} + type BlogPostFilter struct { state protoimpl.MessageState `protogen:"open.v1"` Title *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` @@ -5071,7 +5569,7 @@ type BlogPostFilter struct { func (x *BlogPostFilter) Reset() { *x = BlogPostFilter{} - mi := &file_product_proto_msgTypes[102] + mi := &file_product_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5083,7 +5581,7 @@ func (x *BlogPostFilter) String() string { func (*BlogPostFilter) ProtoMessage() {} func (x *BlogPostFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[102] + mi := &file_product_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5096,7 +5594,7 @@ func (x *BlogPostFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use BlogPostFilter.ProtoReflect.Descriptor instead. func (*BlogPostFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{102} + return file_product_proto_rawDescGZIP(), []int{112} } func (x *BlogPostFilter) GetTitle() *wrapperspb.StringValue { @@ -5121,22 +5619,29 @@ func (x *BlogPostFilter) GetMinTags() *wrapperspb.Int32Value { } type Author struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Email *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` - Skills []string `protobuf:"bytes,4,rep,name=skills,proto3" json:"skills,omitempty"` - Languages []string `protobuf:"bytes,5,rep,name=languages,proto3" json:"languages,omitempty"` - SocialLinks *ListOfString `protobuf:"bytes,6,opt,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` - TeamsByProject *ListOfListOfString `protobuf:"bytes,7,opt,name=teams_by_project,json=teamsByProject,proto3" json:"teams_by_project,omitempty"` - Collaborations *ListOfListOfString `protobuf:"bytes,8,opt,name=collaborations,proto3" json:"collaborations,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Email *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + Skills []string `protobuf:"bytes,4,rep,name=skills,proto3" json:"skills,omitempty"` + Languages []string `protobuf:"bytes,5,rep,name=languages,proto3" json:"languages,omitempty"` + SocialLinks *ListOfString `protobuf:"bytes,6,opt,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` + TeamsByProject *ListOfListOfString `protobuf:"bytes,7,opt,name=teams_by_project,json=teamsByProject,proto3" json:"teams_by_project,omitempty"` + Collaborations *ListOfListOfString `protobuf:"bytes,8,opt,name=collaborations,proto3" json:"collaborations,omitempty"` + WrittenPosts *ListOfBlogPost `protobuf:"bytes,9,opt,name=written_posts,json=writtenPosts,proto3" json:"written_posts,omitempty"` + FavoriteCategories []*Category `protobuf:"bytes,10,rep,name=favorite_categories,json=favoriteCategories,proto3" json:"favorite_categories,omitempty"` + RelatedAuthors *ListOfUser `protobuf:"bytes,11,opt,name=related_authors,json=relatedAuthors,proto3" json:"related_authors,omitempty"` + ProductReviews *ListOfProduct `protobuf:"bytes,12,opt,name=product_reviews,json=productReviews,proto3" json:"product_reviews,omitempty"` + AuthorGroups *ListOfListOfUser `protobuf:"bytes,13,opt,name=author_groups,json=authorGroups,proto3" json:"author_groups,omitempty"` + CategoryPreferences *ListOfListOfCategory `protobuf:"bytes,14,opt,name=category_preferences,json=categoryPreferences,proto3" json:"category_preferences,omitempty"` + ProjectTeams *ListOfListOfUser `protobuf:"bytes,15,opt,name=project_teams,json=projectTeams,proto3" json:"project_teams,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Author) Reset() { *x = Author{} - mi := &file_product_proto_msgTypes[103] + mi := &file_product_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5148,7 +5653,7 @@ func (x *Author) String() string { func (*Author) ProtoMessage() {} func (x *Author) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[103] + mi := &file_product_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5161,7 +5666,7 @@ func (x *Author) ProtoReflect() protoreflect.Message { // Deprecated: Use Author.ProtoReflect.Descriptor instead. func (*Author) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{103} + return file_product_proto_rawDescGZIP(), []int{113} } func (x *Author) GetId() string { @@ -5187,35 +5692,84 @@ func (x *Author) GetEmail() *wrapperspb.StringValue { func (x *Author) GetSkills() []string { if x != nil { - return x.Skills + return x.Skills + } + return nil +} + +func (x *Author) GetLanguages() []string { + if x != nil { + return x.Languages + } + return nil +} + +func (x *Author) GetSocialLinks() *ListOfString { + if x != nil { + return x.SocialLinks + } + return nil +} + +func (x *Author) GetTeamsByProject() *ListOfListOfString { + if x != nil { + return x.TeamsByProject + } + return nil +} + +func (x *Author) GetCollaborations() *ListOfListOfString { + if x != nil { + return x.Collaborations + } + return nil +} + +func (x *Author) GetWrittenPosts() *ListOfBlogPost { + if x != nil { + return x.WrittenPosts + } + return nil +} + +func (x *Author) GetFavoriteCategories() []*Category { + if x != nil { + return x.FavoriteCategories + } + return nil +} + +func (x *Author) GetRelatedAuthors() *ListOfUser { + if x != nil { + return x.RelatedAuthors } return nil } -func (x *Author) GetLanguages() []string { +func (x *Author) GetProductReviews() *ListOfProduct { if x != nil { - return x.Languages + return x.ProductReviews } return nil } -func (x *Author) GetSocialLinks() *ListOfString { +func (x *Author) GetAuthorGroups() *ListOfListOfUser { if x != nil { - return x.SocialLinks + return x.AuthorGroups } return nil } -func (x *Author) GetTeamsByProject() *ListOfListOfString { +func (x *Author) GetCategoryPreferences() *ListOfListOfCategory { if x != nil { - return x.TeamsByProject + return x.CategoryPreferences } return nil } -func (x *Author) GetCollaborations() *ListOfListOfString { +func (x *Author) GetProjectTeams() *ListOfListOfUser { if x != nil { - return x.Collaborations + return x.ProjectTeams } return nil } @@ -5231,7 +5785,7 @@ type AuthorFilter struct { func (x *AuthorFilter) Reset() { *x = AuthorFilter{} - mi := &file_product_proto_msgTypes[104] + mi := &file_product_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5243,7 +5797,7 @@ func (x *AuthorFilter) String() string { func (*AuthorFilter) ProtoMessage() {} func (x *AuthorFilter) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[104] + mi := &file_product_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5256,7 +5810,7 @@ func (x *AuthorFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorFilter.ProtoReflect.Descriptor instead. func (*AuthorFilter) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{104} + return file_product_proto_rawDescGZIP(), []int{114} } func (x *AuthorFilter) GetName() *wrapperspb.StringValue { @@ -5289,7 +5843,7 @@ type UserInput struct { func (x *UserInput) Reset() { *x = UserInput{} - mi := &file_product_proto_msgTypes[105] + mi := &file_product_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5301,7 +5855,7 @@ func (x *UserInput) String() string { func (*UserInput) ProtoMessage() {} func (x *UserInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[105] + mi := &file_product_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5314,7 +5868,7 @@ func (x *UserInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UserInput.ProtoReflect.Descriptor instead. func (*UserInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{105} + return file_product_proto_rawDescGZIP(), []int{115} } func (x *UserInput) GetName() string { @@ -5334,7 +5888,7 @@ type ActionInput struct { func (x *ActionInput) Reset() { *x = ActionInput{} - mi := &file_product_proto_msgTypes[106] + mi := &file_product_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5346,7 +5900,7 @@ func (x *ActionInput) String() string { func (*ActionInput) ProtoMessage() {} func (x *ActionInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[106] + mi := &file_product_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5359,7 +5913,7 @@ func (x *ActionInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionInput.ProtoReflect.Descriptor instead. func (*ActionInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{106} + return file_product_proto_rawDescGZIP(), []int{116} } func (x *ActionInput) GetType() string { @@ -5389,7 +5943,7 @@ type ActionResult struct { func (x *ActionResult) Reset() { *x = ActionResult{} - mi := &file_product_proto_msgTypes[107] + mi := &file_product_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5401,7 +5955,7 @@ func (x *ActionResult) String() string { func (*ActionResult) ProtoMessage() {} func (x *ActionResult) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[107] + mi := &file_product_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5414,7 +5968,7 @@ func (x *ActionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionResult.ProtoReflect.Descriptor instead. func (*ActionResult) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{107} + return file_product_proto_rawDescGZIP(), []int{117} } func (x *ActionResult) GetValue() isActionResult_Value { @@ -5473,7 +6027,7 @@ type NullableFieldsInput struct { func (x *NullableFieldsInput) Reset() { *x = NullableFieldsInput{} - mi := &file_product_proto_msgTypes[108] + mi := &file_product_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5485,7 +6039,7 @@ func (x *NullableFieldsInput) String() string { func (*NullableFieldsInput) ProtoMessage() {} func (x *NullableFieldsInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[108] + mi := &file_product_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5498,7 +6052,7 @@ func (x *NullableFieldsInput) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableFieldsInput.ProtoReflect.Descriptor instead. func (*NullableFieldsInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{108} + return file_product_proto_rawDescGZIP(), []int{118} } func (x *NullableFieldsInput) GetName() string { @@ -5551,27 +6105,30 @@ func (x *NullableFieldsInput) GetRequiredInt() int32 { } type BlogPostInput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - Tags []string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty"` - OptionalTags *ListOfString `protobuf:"bytes,4,opt,name=optional_tags,json=optionalTags,proto3" json:"optional_tags,omitempty"` - Categories []string `protobuf:"bytes,5,rep,name=categories,proto3" json:"categories,omitempty"` - Keywords *ListOfString `protobuf:"bytes,6,opt,name=keywords,proto3" json:"keywords,omitempty"` - ViewCounts []int32 `protobuf:"varint,7,rep,packed,name=view_counts,json=viewCounts,proto3" json:"view_counts,omitempty"` - Ratings *ListOfFloat `protobuf:"bytes,8,opt,name=ratings,proto3" json:"ratings,omitempty"` - IsPublished *ListOfBoolean `protobuf:"bytes,9,opt,name=is_published,json=isPublished,proto3" json:"is_published,omitempty"` - TagGroups *ListOfListOfString `protobuf:"bytes,10,opt,name=tag_groups,json=tagGroups,proto3" json:"tag_groups,omitempty"` - RelatedTopics *ListOfListOfString `protobuf:"bytes,11,opt,name=related_topics,json=relatedTopics,proto3" json:"related_topics,omitempty"` - CommentThreads *ListOfListOfString `protobuf:"bytes,12,opt,name=comment_threads,json=commentThreads,proto3" json:"comment_threads,omitempty"` - Suggestions *ListOfListOfString `protobuf:"bytes,13,opt,name=suggestions,proto3" json:"suggestions,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + Tags []string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty"` + OptionalTags *ListOfString `protobuf:"bytes,4,opt,name=optional_tags,json=optionalTags,proto3" json:"optional_tags,omitempty"` + Categories []string `protobuf:"bytes,5,rep,name=categories,proto3" json:"categories,omitempty"` + Keywords *ListOfString `protobuf:"bytes,6,opt,name=keywords,proto3" json:"keywords,omitempty"` + ViewCounts []int32 `protobuf:"varint,7,rep,packed,name=view_counts,json=viewCounts,proto3" json:"view_counts,omitempty"` + Ratings *ListOfFloat `protobuf:"bytes,8,opt,name=ratings,proto3" json:"ratings,omitempty"` + IsPublished *ListOfBoolean `protobuf:"bytes,9,opt,name=is_published,json=isPublished,proto3" json:"is_published,omitempty"` + TagGroups *ListOfListOfString `protobuf:"bytes,10,opt,name=tag_groups,json=tagGroups,proto3" json:"tag_groups,omitempty"` + RelatedTopics *ListOfListOfString `protobuf:"bytes,11,opt,name=related_topics,json=relatedTopics,proto3" json:"related_topics,omitempty"` + CommentThreads *ListOfListOfString `protobuf:"bytes,12,opt,name=comment_threads,json=commentThreads,proto3" json:"comment_threads,omitempty"` + Suggestions *ListOfListOfString `protobuf:"bytes,13,opt,name=suggestions,proto3" json:"suggestions,omitempty"` + RelatedCategories *ListOfCategoryInput `protobuf:"bytes,14,opt,name=related_categories,json=relatedCategories,proto3" json:"related_categories,omitempty"` + Contributors *ListOfUserInput `protobuf:"bytes,15,opt,name=contributors,proto3" json:"contributors,omitempty"` + CategoryGroups *ListOfListOfCategoryInput `protobuf:"bytes,16,opt,name=category_groups,json=categoryGroups,proto3" json:"category_groups,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BlogPostInput) Reset() { *x = BlogPostInput{} - mi := &file_product_proto_msgTypes[109] + mi := &file_product_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5583,7 +6140,7 @@ func (x *BlogPostInput) String() string { func (*BlogPostInput) ProtoMessage() {} func (x *BlogPostInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[109] + mi := &file_product_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5596,7 +6153,7 @@ func (x *BlogPostInput) ProtoReflect() protoreflect.Message { // Deprecated: Use BlogPostInput.ProtoReflect.Descriptor instead. func (*BlogPostInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{109} + return file_product_proto_rawDescGZIP(), []int{119} } func (x *BlogPostInput) GetTitle() string { @@ -5690,22 +6247,46 @@ func (x *BlogPostInput) GetSuggestions() *ListOfListOfString { return nil } +func (x *BlogPostInput) GetRelatedCategories() *ListOfCategoryInput { + if x != nil { + return x.RelatedCategories + } + return nil +} + +func (x *BlogPostInput) GetContributors() *ListOfUserInput { + if x != nil { + return x.Contributors + } + return nil +} + +func (x *BlogPostInput) GetCategoryGroups() *ListOfListOfCategoryInput { + if x != nil { + return x.CategoryGroups + } + return nil +} + type AuthorInput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Email *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - Skills []string `protobuf:"bytes,3,rep,name=skills,proto3" json:"skills,omitempty"` - Languages []string `protobuf:"bytes,4,rep,name=languages,proto3" json:"languages,omitempty"` - SocialLinks *ListOfString `protobuf:"bytes,5,opt,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` - TeamsByProject *ListOfListOfString `protobuf:"bytes,6,opt,name=teams_by_project,json=teamsByProject,proto3" json:"teams_by_project,omitempty"` - Collaborations *ListOfListOfString `protobuf:"bytes,7,opt,name=collaborations,proto3" json:"collaborations,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Email *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + Skills []string `protobuf:"bytes,3,rep,name=skills,proto3" json:"skills,omitempty"` + Languages []string `protobuf:"bytes,4,rep,name=languages,proto3" json:"languages,omitempty"` + SocialLinks *ListOfString `protobuf:"bytes,5,opt,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` + TeamsByProject *ListOfListOfString `protobuf:"bytes,6,opt,name=teams_by_project,json=teamsByProject,proto3" json:"teams_by_project,omitempty"` + Collaborations *ListOfListOfString `protobuf:"bytes,7,opt,name=collaborations,proto3" json:"collaborations,omitempty"` + FavoriteCategories []*CategoryInput `protobuf:"bytes,8,rep,name=favorite_categories,json=favoriteCategories,proto3" json:"favorite_categories,omitempty"` + AuthorGroups *ListOfListOfUserInput `protobuf:"bytes,9,opt,name=author_groups,json=authorGroups,proto3" json:"author_groups,omitempty"` + ProjectTeams *ListOfListOfUserInput `protobuf:"bytes,10,opt,name=project_teams,json=projectTeams,proto3" json:"project_teams,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthorInput) Reset() { *x = AuthorInput{} - mi := &file_product_proto_msgTypes[110] + mi := &file_product_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5717,7 +6298,7 @@ func (x *AuthorInput) String() string { func (*AuthorInput) ProtoMessage() {} func (x *AuthorInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[110] + mi := &file_product_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5730,7 +6311,7 @@ func (x *AuthorInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorInput.ProtoReflect.Descriptor instead. func (*AuthorInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{110} + return file_product_proto_rawDescGZIP(), []int{120} } func (x *AuthorInput) GetName() string { @@ -5782,6 +6363,27 @@ func (x *AuthorInput) GetCollaborations() *ListOfListOfString { return nil } +func (x *AuthorInput) GetFavoriteCategories() []*CategoryInput { + if x != nil { + return x.FavoriteCategories + } + return nil +} + +func (x *AuthorInput) GetAuthorGroups() *ListOfListOfUserInput { + if x != nil { + return x.AuthorGroups + } + return nil +} + +func (x *AuthorInput) GetProjectTeams() *ListOfListOfUserInput { + if x != nil { + return x.ProjectTeams + } + return nil +} + type NestedTypeB struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -5793,7 +6395,7 @@ type NestedTypeB struct { func (x *NestedTypeB) Reset() { *x = NestedTypeB{} - mi := &file_product_proto_msgTypes[111] + mi := &file_product_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5805,7 +6407,7 @@ func (x *NestedTypeB) String() string { func (*NestedTypeB) ProtoMessage() {} func (x *NestedTypeB) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[111] + mi := &file_product_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5818,7 +6420,7 @@ func (x *NestedTypeB) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeB.ProtoReflect.Descriptor instead. func (*NestedTypeB) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{111} + return file_product_proto_rawDescGZIP(), []int{121} } func (x *NestedTypeB) GetId() string { @@ -5852,7 +6454,7 @@ type NestedTypeC struct { func (x *NestedTypeC) Reset() { *x = NestedTypeC{} - mi := &file_product_proto_msgTypes[112] + mi := &file_product_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5864,7 +6466,7 @@ func (x *NestedTypeC) String() string { func (*NestedTypeC) ProtoMessage() {} func (x *NestedTypeC) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[112] + mi := &file_product_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5877,7 +6479,7 @@ func (x *NestedTypeC) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedTypeC.ProtoReflect.Descriptor instead. func (*NestedTypeC) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{112} + return file_product_proto_rawDescGZIP(), []int{122} } func (x *NestedTypeC) GetId() string { @@ -5906,7 +6508,7 @@ type FilterType struct { func (x *FilterType) Reset() { *x = FilterType{} - mi := &file_product_proto_msgTypes[113] + mi := &file_product_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5918,7 +6520,7 @@ func (x *FilterType) String() string { func (*FilterType) ProtoMessage() {} func (x *FilterType) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[113] + mi := &file_product_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5931,7 +6533,7 @@ func (x *FilterType) ProtoReflect() protoreflect.Message { // Deprecated: Use FilterType.ProtoReflect.Descriptor instead. func (*FilterType) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{113} + return file_product_proto_rawDescGZIP(), []int{123} } func (x *FilterType) GetName() string { @@ -5972,7 +6574,7 @@ type Pagination struct { func (x *Pagination) Reset() { *x = Pagination{} - mi := &file_product_proto_msgTypes[114] + mi := &file_product_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5984,7 +6586,7 @@ func (x *Pagination) String() string { func (*Pagination) ProtoMessage() {} func (x *Pagination) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[114] + mi := &file_product_proto_msgTypes[124] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5997,7 +6599,7 @@ func (x *Pagination) ProtoReflect() protoreflect.Message { // Deprecated: Use Pagination.ProtoReflect.Descriptor instead. func (*Pagination) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{114} + return file_product_proto_rawDescGZIP(), []int{124} } func (x *Pagination) GetPage() int32 { @@ -6025,7 +6627,7 @@ type OrderLineInput struct { func (x *OrderLineInput) Reset() { *x = OrderLineInput{} - mi := &file_product_proto_msgTypes[115] + mi := &file_product_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6037,7 +6639,7 @@ func (x *OrderLineInput) String() string { func (*OrderLineInput) ProtoMessage() {} func (x *OrderLineInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[115] + mi := &file_product_proto_msgTypes[125] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6050,7 +6652,7 @@ func (x *OrderLineInput) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderLineInput.ProtoReflect.Descriptor instead. func (*OrderLineInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{115} + return file_product_proto_rawDescGZIP(), []int{125} } func (x *OrderLineInput) GetProductId() string { @@ -6085,7 +6687,7 @@ type OrderLine struct { func (x *OrderLine) Reset() { *x = OrderLine{} - mi := &file_product_proto_msgTypes[116] + mi := &file_product_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6097,7 +6699,7 @@ func (x *OrderLine) String() string { func (*OrderLine) ProtoMessage() {} func (x *OrderLine) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[116] + mi := &file_product_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6110,7 +6712,7 @@ func (x *OrderLine) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderLine.ProtoReflect.Descriptor instead. func (*OrderLine) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{116} + return file_product_proto_rawDescGZIP(), []int{126} } func (x *OrderLine) GetProductId() string { @@ -6146,7 +6748,7 @@ type Cat struct { func (x *Cat) Reset() { *x = Cat{} - mi := &file_product_proto_msgTypes[117] + mi := &file_product_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6158,7 +6760,7 @@ func (x *Cat) String() string { func (*Cat) ProtoMessage() {} func (x *Cat) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[117] + mi := &file_product_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6171,7 +6773,7 @@ func (x *Cat) ProtoReflect() protoreflect.Message { // Deprecated: Use Cat.ProtoReflect.Descriptor instead. func (*Cat) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{117} + return file_product_proto_rawDescGZIP(), []int{127} } func (x *Cat) GetId() string { @@ -6214,7 +6816,7 @@ type Dog struct { func (x *Dog) Reset() { *x = Dog{} - mi := &file_product_proto_msgTypes[118] + mi := &file_product_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6226,7 +6828,7 @@ func (x *Dog) String() string { func (*Dog) ProtoMessage() {} func (x *Dog) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[118] + mi := &file_product_proto_msgTypes[128] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6239,7 +6841,7 @@ func (x *Dog) ProtoReflect() protoreflect.Message { // Deprecated: Use Dog.ProtoReflect.Descriptor instead. func (*Dog) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{118} + return file_product_proto_rawDescGZIP(), []int{128} } func (x *Dog) GetId() string { @@ -6280,7 +6882,7 @@ type ActionSuccess struct { func (x *ActionSuccess) Reset() { *x = ActionSuccess{} - mi := &file_product_proto_msgTypes[119] + mi := &file_product_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6292,7 +6894,7 @@ func (x *ActionSuccess) String() string { func (*ActionSuccess) ProtoMessage() {} func (x *ActionSuccess) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[119] + mi := &file_product_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6305,7 +6907,7 @@ func (x *ActionSuccess) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionSuccess.ProtoReflect.Descriptor instead. func (*ActionSuccess) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{119} + return file_product_proto_rawDescGZIP(), []int{129} } func (x *ActionSuccess) GetMessage() string { @@ -6332,7 +6934,7 @@ type ActionError struct { func (x *ActionError) Reset() { *x = ActionError{} - mi := &file_product_proto_msgTypes[120] + mi := &file_product_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6344,7 +6946,7 @@ func (x *ActionError) String() string { func (*ActionError) ProtoMessage() {} func (x *ActionError) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[120] + mi := &file_product_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6357,7 +6959,7 @@ func (x *ActionError) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionError.ProtoReflect.Descriptor instead. func (*ActionError) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{120} + return file_product_proto_rawDescGZIP(), []int{130} } func (x *ActionError) GetMessage() string { @@ -6384,7 +6986,7 @@ type CategoryInput struct { func (x *CategoryInput) Reset() { *x = CategoryInput{} - mi := &file_product_proto_msgTypes[121] + mi := &file_product_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6396,7 +6998,7 @@ func (x *CategoryInput) String() string { func (*CategoryInput) ProtoMessage() {} func (x *CategoryInput) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[121] + mi := &file_product_proto_msgTypes[131] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6409,7 +7011,7 @@ func (x *CategoryInput) ProtoReflect() protoreflect.Message { // Deprecated: Use CategoryInput.ProtoReflect.Descriptor instead. func (*CategoryInput) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{121} + return file_product_proto_rawDescGZIP(), []int{131} } func (x *CategoryInput) GetName() string { @@ -6426,6 +7028,94 @@ func (x *CategoryInput) GetKind() CategoryKind { return CategoryKind_CATEGORY_KIND_UNSPECIFIED } +type ListOfListOfCategory_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*ListOfCategory `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfCategory_List) Reset() { + *x = ListOfListOfCategory_List{} + mi := &file_product_proto_msgTypes[132] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfCategory_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfCategory_List) ProtoMessage() {} + +func (x *ListOfListOfCategory_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[132] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfCategory_List.ProtoReflect.Descriptor instead. +func (*ListOfListOfCategory_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{5, 0} +} + +func (x *ListOfListOfCategory_List) GetItems() []*ListOfCategory { + if x != nil { + return x.Items + } + return nil +} + +type ListOfListOfCategoryInput_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*ListOfCategoryInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfCategoryInput_List) Reset() { + *x = ListOfListOfCategoryInput_List{} + mi := &file_product_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfCategoryInput_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfCategoryInput_List) ProtoMessage() {} + +func (x *ListOfListOfCategoryInput_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[133] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfCategoryInput_List.ProtoReflect.Descriptor instead. +func (*ListOfListOfCategoryInput_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *ListOfListOfCategoryInput_List) GetItems() []*ListOfCategoryInput { + if x != nil { + return x.Items + } + return nil +} + type ListOfListOfString_List struct { state protoimpl.MessageState `protogen:"open.v1"` Items []*ListOfString `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` @@ -6435,7 +7125,7 @@ type ListOfListOfString_List struct { func (x *ListOfListOfString_List) Reset() { *x = ListOfListOfString_List{} - mi := &file_product_proto_msgTypes[122] + mi := &file_product_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6447,7 +7137,7 @@ func (x *ListOfListOfString_List) String() string { func (*ListOfListOfString_List) ProtoMessage() {} func (x *ListOfListOfString_List) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[122] + mi := &file_product_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6460,7 +7150,7 @@ func (x *ListOfListOfString_List) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOfListOfString_List.ProtoReflect.Descriptor instead. func (*ListOfListOfString_List) Descriptor() ([]byte, []int) { - return file_product_proto_rawDescGZIP(), []int{2, 0} + return file_product_proto_rawDescGZIP(), []int{7, 0} } func (x *ListOfListOfString_List) GetItems() []*ListOfString { @@ -6470,23 +7160,140 @@ func (x *ListOfListOfString_List) GetItems() []*ListOfString { return nil } +type ListOfListOfUser_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*ListOfUser `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfUser_List) Reset() { + *x = ListOfListOfUser_List{} + mi := &file_product_proto_msgTypes[135] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfUser_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfUser_List) ProtoMessage() {} + +func (x *ListOfListOfUser_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[135] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfUser_List.ProtoReflect.Descriptor instead. +func (*ListOfListOfUser_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{8, 0} +} + +func (x *ListOfListOfUser_List) GetItems() []*ListOfUser { + if x != nil { + return x.Items + } + return nil +} + +type ListOfListOfUserInput_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*ListOfUserInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfListOfUserInput_List) Reset() { + *x = ListOfListOfUserInput_List{} + mi := &file_product_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfListOfUserInput_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfListOfUserInput_List) ProtoMessage() {} + +func (x *ListOfListOfUserInput_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[136] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfListOfUserInput_List.ProtoReflect.Descriptor instead. +func (*ListOfListOfUserInput_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{9, 0} +} + +func (x *ListOfListOfUserInput_List) GetItems() []*ListOfUserInput { + if x != nil { + return x.Items + } + return nil +} + var File_product_proto protoreflect.FileDescriptor const file_product_proto_rawDesc = "" + "\n" + - "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\"%\n" + + "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\";\n" + + "\x0eListOfBlogPost\x12)\n" + + "\x05items\x18\x01 \x03(\v2\x13.productv1.BlogPostR\x05items\"%\n" + "\rListOfBoolean\x12\x14\n" + - "\x05items\x18\x01 \x03(\bR\x05items\"#\n" + + "\x05items\x18\x01 \x03(\bR\x05items\";\n" + + "\x0eListOfCategory\x12)\n" + + "\x05items\x18\x01 \x03(\v2\x13.productv1.CategoryR\x05items\"E\n" + + "\x13ListOfCategoryInput\x12.\n" + + "\x05items\x18\x01 \x03(\v2\x18.productv1.CategoryInputR\x05items\"#\n" + "\vListOfFloat\x12\x14\n" + - "\x05items\x18\x01 \x03(\x01R\x05items\"\x83\x01\n" + + "\x05items\x18\x01 \x03(\x01R\x05items\"\x89\x01\n" + + "\x14ListOfListOfCategory\x128\n" + + "\x04list\x18\x01 \x01(\v2$.productv1.ListOfListOfCategory.ListR\x04list\x1a7\n" + + "\x04List\x12/\n" + + "\x05items\x18\x01 \x03(\v2\x19.productv1.ListOfCategoryR\x05items\"\x98\x01\n" + + "\x19ListOfListOfCategoryInput\x12=\n" + + "\x04list\x18\x01 \x01(\v2).productv1.ListOfListOfCategoryInput.ListR\x04list\x1a<\n" + + "\x04List\x124\n" + + "\x05items\x18\x01 \x03(\v2\x1e.productv1.ListOfCategoryInputR\x05items\"\x83\x01\n" + "\x12ListOfListOfString\x126\n" + "\x04list\x18\x01 \x01(\v2\".productv1.ListOfListOfString.ListR\x04list\x1a5\n" + "\x04List\x12-\n" + - "\x05items\x18\x01 \x03(\v2\x17.productv1.ListOfStringR\x05items\"=\n" + + "\x05items\x18\x01 \x03(\v2\x17.productv1.ListOfStringR\x05items\"}\n" + + "\x10ListOfListOfUser\x124\n" + + "\x04list\x18\x01 \x01(\v2 .productv1.ListOfListOfUser.ListR\x04list\x1a3\n" + + "\x04List\x12+\n" + + "\x05items\x18\x01 \x03(\v2\x15.productv1.ListOfUserR\x05items\"\x8c\x01\n" + + "\x15ListOfListOfUserInput\x129\n" + + "\x04list\x18\x01 \x01(\v2%.productv1.ListOfListOfUserInput.ListR\x04list\x1a8\n" + + "\x04List\x120\n" + + "\x05items\x18\x01 \x03(\v2\x1a.productv1.ListOfUserInputR\x05items\"=\n" + "\x0fListOfOrderLine\x12*\n" + - "\x05items\x18\x01 \x03(\v2\x14.productv1.OrderLineR\x05items\"$\n" + + "\x05items\x18\x01 \x03(\v2\x14.productv1.OrderLineR\x05items\"9\n" + + "\rListOfProduct\x12(\n" + + "\x05items\x18\x01 \x03(\v2\x12.productv1.ProductR\x05items\"$\n" + "\fListOfString\x12\x14\n" + - "\x05items\x18\x01 \x03(\tR\x05items\"-\n" + + "\x05items\x18\x01 \x03(\tR\x05items\"3\n" + + "\n" + + "ListOfUser\x12%\n" + + "\x05items\x18\x01 \x03(\v2\x0f.productv1.UserR\x05items\"=\n" + + "\x0fListOfUserInput\x12*\n" + + "\x05items\x18\x01 \x03(\v2\x14.productv1.UserInputR\x05items\"-\n" + "\x1bLookupProductByIdRequestKey\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\"V\n" + "\x18LookupProductByIdRequest\x12:\n" + @@ -6719,7 +7526,7 @@ const file_product_proto_rawDesc = "" + "\x14NullableFieldsFilter\x120\n" + "\x04name\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12E\n" + "\x0foptional_string\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x0eoptionalString\x12?\n" + - "\rinclude_nulls\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\fincludeNulls\"\x8e\x05\n" + + "\rinclude_nulls\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\fincludeNulls\"\xa4\b\n" + "\bBlogPost\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + "\x05title\x18\x02 \x01(\tR\x05title\x12\x18\n" + @@ -6739,11 +7546,17 @@ const file_product_proto_rawDesc = "" + "tag_groups\x18\v \x01(\v2\x1d.productv1.ListOfListOfStringR\ttagGroups\x12D\n" + "\x0erelated_topics\x18\f \x01(\v2\x1d.productv1.ListOfListOfStringR\rrelatedTopics\x12F\n" + "\x0fcomment_threads\x18\r \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecommentThreads\x12?\n" + - "\vsuggestions\x18\x0e \x01(\v2\x1d.productv1.ListOfListOfStringR\vsuggestions\"\xbf\x01\n" + + "\vsuggestions\x18\x0e \x01(\v2\x1d.productv1.ListOfListOfStringR\vsuggestions\x12B\n" + + "\x12related_categories\x18\x0f \x03(\v2\x13.productv1.CategoryR\x11relatedCategories\x123\n" + + "\fcontributors\x18\x10 \x03(\v2\x0f.productv1.UserR\fcontributors\x12G\n" + + "\x12mentioned_products\x18\x11 \x01(\v2\x18.productv1.ListOfProductR\x11mentionedProducts\x12>\n" + + "\x0fmentioned_users\x18\x12 \x01(\v2\x15.productv1.ListOfUserR\x0ementionedUsers\x12H\n" + + "\x0fcategory_groups\x18\x13 \x01(\v2\x1f.productv1.ListOfListOfCategoryR\x0ecategoryGroups\x12H\n" + + "\x11contributor_teams\x18\x14 \x01(\v2\x1b.productv1.ListOfListOfUserR\x10contributorTeams\"\xbf\x01\n" + "\x0eBlogPostFilter\x122\n" + "\x05title\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x05title\x12A\n" + "\x0ehas_categories\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\rhasCategories\x126\n" + - "\bmin_tags\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\aminTags\"\xe2\x02\n" + + "\bmin_tags\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\aminTags\"\xc3\x06\n" + "\x06Author\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x122\n" + @@ -6752,7 +7565,15 @@ const file_product_proto_rawDesc = "" + "\tlanguages\x18\x05 \x03(\tR\tlanguages\x12:\n" + "\fsocial_links\x18\x06 \x01(\v2\x17.productv1.ListOfStringR\vsocialLinks\x12G\n" + "\x10teams_by_project\x18\a \x01(\v2\x1d.productv1.ListOfListOfStringR\x0eteamsByProject\x12E\n" + - "\x0ecollaborations\x18\b \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecollaborations\"\xb7\x01\n" + + "\x0ecollaborations\x18\b \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecollaborations\x12>\n" + + "\rwritten_posts\x18\t \x01(\v2\x19.productv1.ListOfBlogPostR\fwrittenPosts\x12D\n" + + "\x13favorite_categories\x18\n" + + " \x03(\v2\x13.productv1.CategoryR\x12favoriteCategories\x12>\n" + + "\x0frelated_authors\x18\v \x01(\v2\x15.productv1.ListOfUserR\x0erelatedAuthors\x12A\n" + + "\x0fproduct_reviews\x18\f \x01(\v2\x18.productv1.ListOfProductR\x0eproductReviews\x12@\n" + + "\rauthor_groups\x18\r \x01(\v2\x1b.productv1.ListOfListOfUserR\fauthorGroups\x12R\n" + + "\x14category_preferences\x18\x0e \x01(\v2\x1f.productv1.ListOfListOfCategoryR\x13categoryPreferences\x12@\n" + + "\rproject_teams\x18\x0f \x01(\v2\x1b.productv1.ListOfListOfUserR\fprojectTeams\"\xb7\x01\n" + "\fAuthorFilter\x120\n" + "\x04name\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x127\n" + "\thas_teams\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\bhasTeams\x12<\n" + @@ -6774,7 +7595,7 @@ const file_product_proto_rawDesc = "" + "\x0eoptional_float\x18\x04 \x01(\v2\x1c.google.protobuf.DoubleValueR\roptionalFloat\x12E\n" + "\x10optional_boolean\x18\x05 \x01(\v2\x1a.google.protobuf.BoolValueR\x0foptionalBoolean\x12'\n" + "\x0frequired_string\x18\x06 \x01(\tR\x0erequiredString\x12!\n" + - "\frequired_int\x18\a \x01(\x05R\vrequiredInt\"\x83\x05\n" + + "\frequired_int\x18\a \x01(\x05R\vrequiredInt\"\xe1\x06\n" + "\rBlogPostInput\x12\x14\n" + "\x05title\x18\x01 \x01(\tR\x05title\x12\x18\n" + "\acontent\x18\x02 \x01(\tR\acontent\x12\x12\n" + @@ -6793,7 +7614,10 @@ const file_product_proto_rawDesc = "" + " \x01(\v2\x1d.productv1.ListOfListOfStringR\ttagGroups\x12D\n" + "\x0erelated_topics\x18\v \x01(\v2\x1d.productv1.ListOfListOfStringR\rrelatedTopics\x12F\n" + "\x0fcomment_threads\x18\f \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecommentThreads\x12?\n" + - "\vsuggestions\x18\r \x01(\v2\x1d.productv1.ListOfListOfStringR\vsuggestions\"\xd7\x02\n" + + "\vsuggestions\x18\r \x01(\v2\x1d.productv1.ListOfListOfStringR\vsuggestions\x12M\n" + + "\x12related_categories\x18\x0e \x01(\v2\x1e.productv1.ListOfCategoryInputR\x11relatedCategories\x12>\n" + + "\fcontributors\x18\x0f \x01(\v2\x1a.productv1.ListOfUserInputR\fcontributors\x12M\n" + + "\x0fcategory_groups\x18\x10 \x01(\v2$.productv1.ListOfListOfCategoryInputR\x0ecategoryGroups\"\xb0\x04\n" + "\vAuthorInput\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x122\n" + "\x05email\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x05email\x12\x16\n" + @@ -6801,7 +7625,11 @@ const file_product_proto_rawDesc = "" + "\tlanguages\x18\x04 \x03(\tR\tlanguages\x12:\n" + "\fsocial_links\x18\x05 \x01(\v2\x17.productv1.ListOfStringR\vsocialLinks\x12G\n" + "\x10teams_by_project\x18\x06 \x01(\v2\x1d.productv1.ListOfListOfStringR\x0eteamsByProject\x12E\n" + - "\x0ecollaborations\x18\a \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecollaborations\"W\n" + + "\x0ecollaborations\x18\a \x01(\v2\x1d.productv1.ListOfListOfStringR\x0ecollaborations\x12I\n" + + "\x13favorite_categories\x18\b \x03(\v2\x18.productv1.CategoryInputR\x12favoriteCategories\x12E\n" + + "\rauthor_groups\x18\t \x01(\v2 .productv1.ListOfListOfUserInputR\fauthorGroups\x12E\n" + + "\rproject_teams\x18\n" + + " \x01(\v2 .productv1.ListOfListOfUserInputR\fprojectTeams\"W\n" + "\vNestedTypeB\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12$\n" + @@ -6912,342 +7740,389 @@ func file_product_proto_rawDescGZIP() []byte { } var file_product_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 123) +var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 137) var file_product_proto_goTypes = []any{ (CategoryKind)(0), // 0: productv1.CategoryKind - (*ListOfBoolean)(nil), // 1: productv1.ListOfBoolean - (*ListOfFloat)(nil), // 2: productv1.ListOfFloat - (*ListOfListOfString)(nil), // 3: productv1.ListOfListOfString - (*ListOfOrderLine)(nil), // 4: productv1.ListOfOrderLine - (*ListOfString)(nil), // 5: productv1.ListOfString - (*LookupProductByIdRequestKey)(nil), // 6: productv1.LookupProductByIdRequestKey - (*LookupProductByIdRequest)(nil), // 7: productv1.LookupProductByIdRequest - (*LookupProductByIdResponse)(nil), // 8: productv1.LookupProductByIdResponse - (*LookupStorageByIdRequestKey)(nil), // 9: productv1.LookupStorageByIdRequestKey - (*LookupStorageByIdRequest)(nil), // 10: productv1.LookupStorageByIdRequest - (*LookupStorageByIdResponse)(nil), // 11: productv1.LookupStorageByIdResponse - (*QueryUsersRequest)(nil), // 12: productv1.QueryUsersRequest - (*QueryUsersResponse)(nil), // 13: productv1.QueryUsersResponse - (*QueryUserRequest)(nil), // 14: productv1.QueryUserRequest - (*QueryUserResponse)(nil), // 15: productv1.QueryUserResponse - (*QueryNestedTypeRequest)(nil), // 16: productv1.QueryNestedTypeRequest - (*QueryNestedTypeResponse)(nil), // 17: productv1.QueryNestedTypeResponse - (*QueryRecursiveTypeRequest)(nil), // 18: productv1.QueryRecursiveTypeRequest - (*QueryRecursiveTypeResponse)(nil), // 19: productv1.QueryRecursiveTypeResponse - (*QueryTypeFilterWithArgumentsRequest)(nil), // 20: productv1.QueryTypeFilterWithArgumentsRequest - (*QueryTypeFilterWithArgumentsResponse)(nil), // 21: productv1.QueryTypeFilterWithArgumentsResponse - (*QueryTypeWithMultipleFilterFieldsRequest)(nil), // 22: productv1.QueryTypeWithMultipleFilterFieldsRequest - (*QueryTypeWithMultipleFilterFieldsResponse)(nil), // 23: productv1.QueryTypeWithMultipleFilterFieldsResponse - (*QueryComplexFilterTypeRequest)(nil), // 24: productv1.QueryComplexFilterTypeRequest - (*QueryComplexFilterTypeResponse)(nil), // 25: productv1.QueryComplexFilterTypeResponse - (*QueryCalculateTotalsRequest)(nil), // 26: productv1.QueryCalculateTotalsRequest - (*QueryCalculateTotalsResponse)(nil), // 27: productv1.QueryCalculateTotalsResponse - (*QueryCategoriesRequest)(nil), // 28: productv1.QueryCategoriesRequest - (*QueryCategoriesResponse)(nil), // 29: productv1.QueryCategoriesResponse - (*QueryCategoriesByKindRequest)(nil), // 30: productv1.QueryCategoriesByKindRequest - (*QueryCategoriesByKindResponse)(nil), // 31: productv1.QueryCategoriesByKindResponse - (*QueryCategoriesByKindsRequest)(nil), // 32: productv1.QueryCategoriesByKindsRequest - (*QueryCategoriesByKindsResponse)(nil), // 33: productv1.QueryCategoriesByKindsResponse - (*QueryFilterCategoriesRequest)(nil), // 34: productv1.QueryFilterCategoriesRequest - (*QueryFilterCategoriesResponse)(nil), // 35: productv1.QueryFilterCategoriesResponse - (*QueryRandomPetRequest)(nil), // 36: productv1.QueryRandomPetRequest - (*QueryRandomPetResponse)(nil), // 37: productv1.QueryRandomPetResponse - (*QueryAllPetsRequest)(nil), // 38: productv1.QueryAllPetsRequest - (*QueryAllPetsResponse)(nil), // 39: productv1.QueryAllPetsResponse - (*QuerySearchRequest)(nil), // 40: productv1.QuerySearchRequest - (*QuerySearchResponse)(nil), // 41: productv1.QuerySearchResponse - (*QueryRandomSearchResultRequest)(nil), // 42: productv1.QueryRandomSearchResultRequest - (*QueryRandomSearchResultResponse)(nil), // 43: productv1.QueryRandomSearchResultResponse - (*QueryNullableFieldsTypeRequest)(nil), // 44: productv1.QueryNullableFieldsTypeRequest - (*QueryNullableFieldsTypeResponse)(nil), // 45: productv1.QueryNullableFieldsTypeResponse - (*QueryNullableFieldsTypeByIdRequest)(nil), // 46: productv1.QueryNullableFieldsTypeByIdRequest - (*QueryNullableFieldsTypeByIdResponse)(nil), // 47: productv1.QueryNullableFieldsTypeByIdResponse - (*QueryNullableFieldsTypeWithFilterRequest)(nil), // 48: productv1.QueryNullableFieldsTypeWithFilterRequest - (*QueryNullableFieldsTypeWithFilterResponse)(nil), // 49: productv1.QueryNullableFieldsTypeWithFilterResponse - (*QueryAllNullableFieldsTypesRequest)(nil), // 50: productv1.QueryAllNullableFieldsTypesRequest - (*QueryAllNullableFieldsTypesResponse)(nil), // 51: productv1.QueryAllNullableFieldsTypesResponse - (*QueryBlogPostRequest)(nil), // 52: productv1.QueryBlogPostRequest - (*QueryBlogPostResponse)(nil), // 53: productv1.QueryBlogPostResponse - (*QueryBlogPostByIdRequest)(nil), // 54: productv1.QueryBlogPostByIdRequest - (*QueryBlogPostByIdResponse)(nil), // 55: productv1.QueryBlogPostByIdResponse - (*QueryBlogPostsWithFilterRequest)(nil), // 56: productv1.QueryBlogPostsWithFilterRequest - (*QueryBlogPostsWithFilterResponse)(nil), // 57: productv1.QueryBlogPostsWithFilterResponse - (*QueryAllBlogPostsRequest)(nil), // 58: productv1.QueryAllBlogPostsRequest - (*QueryAllBlogPostsResponse)(nil), // 59: productv1.QueryAllBlogPostsResponse - (*QueryAuthorRequest)(nil), // 60: productv1.QueryAuthorRequest - (*QueryAuthorResponse)(nil), // 61: productv1.QueryAuthorResponse - (*QueryAuthorByIdRequest)(nil), // 62: productv1.QueryAuthorByIdRequest - (*QueryAuthorByIdResponse)(nil), // 63: productv1.QueryAuthorByIdResponse - (*QueryAuthorsWithFilterRequest)(nil), // 64: productv1.QueryAuthorsWithFilterRequest - (*QueryAuthorsWithFilterResponse)(nil), // 65: productv1.QueryAuthorsWithFilterResponse - (*QueryAllAuthorsRequest)(nil), // 66: productv1.QueryAllAuthorsRequest - (*QueryAllAuthorsResponse)(nil), // 67: productv1.QueryAllAuthorsResponse - (*MutationCreateUserRequest)(nil), // 68: productv1.MutationCreateUserRequest - (*MutationCreateUserResponse)(nil), // 69: productv1.MutationCreateUserResponse - (*MutationPerformActionRequest)(nil), // 70: productv1.MutationPerformActionRequest - (*MutationPerformActionResponse)(nil), // 71: productv1.MutationPerformActionResponse - (*MutationCreateNullableFieldsTypeRequest)(nil), // 72: productv1.MutationCreateNullableFieldsTypeRequest - (*MutationCreateNullableFieldsTypeResponse)(nil), // 73: productv1.MutationCreateNullableFieldsTypeResponse - (*MutationUpdateNullableFieldsTypeRequest)(nil), // 74: productv1.MutationUpdateNullableFieldsTypeRequest - (*MutationUpdateNullableFieldsTypeResponse)(nil), // 75: productv1.MutationUpdateNullableFieldsTypeResponse - (*MutationCreateBlogPostRequest)(nil), // 76: productv1.MutationCreateBlogPostRequest - (*MutationCreateBlogPostResponse)(nil), // 77: productv1.MutationCreateBlogPostResponse - (*MutationUpdateBlogPostRequest)(nil), // 78: productv1.MutationUpdateBlogPostRequest - (*MutationUpdateBlogPostResponse)(nil), // 79: productv1.MutationUpdateBlogPostResponse - (*MutationCreateAuthorRequest)(nil), // 80: productv1.MutationCreateAuthorRequest - (*MutationCreateAuthorResponse)(nil), // 81: productv1.MutationCreateAuthorResponse - (*MutationUpdateAuthorRequest)(nil), // 82: productv1.MutationUpdateAuthorRequest - (*MutationUpdateAuthorResponse)(nil), // 83: productv1.MutationUpdateAuthorResponse - (*Product)(nil), // 84: productv1.Product - (*Storage)(nil), // 85: productv1.Storage - (*User)(nil), // 86: productv1.User - (*NestedTypeA)(nil), // 87: productv1.NestedTypeA - (*RecursiveType)(nil), // 88: productv1.RecursiveType - (*TypeWithMultipleFilterFields)(nil), // 89: productv1.TypeWithMultipleFilterFields - (*FilterTypeInput)(nil), // 90: productv1.FilterTypeInput - (*ComplexFilterTypeInput)(nil), // 91: productv1.ComplexFilterTypeInput - (*TypeWithComplexFilterInput)(nil), // 92: productv1.TypeWithComplexFilterInput - (*OrderInput)(nil), // 93: productv1.OrderInput - (*Order)(nil), // 94: productv1.Order - (*Category)(nil), // 95: productv1.Category - (*CategoryFilter)(nil), // 96: productv1.CategoryFilter - (*Animal)(nil), // 97: productv1.Animal - (*SearchInput)(nil), // 98: productv1.SearchInput - (*SearchResult)(nil), // 99: productv1.SearchResult - (*NullableFieldsType)(nil), // 100: productv1.NullableFieldsType - (*NullableFieldsFilter)(nil), // 101: productv1.NullableFieldsFilter - (*BlogPost)(nil), // 102: productv1.BlogPost - (*BlogPostFilter)(nil), // 103: productv1.BlogPostFilter - (*Author)(nil), // 104: productv1.Author - (*AuthorFilter)(nil), // 105: productv1.AuthorFilter - (*UserInput)(nil), // 106: productv1.UserInput - (*ActionInput)(nil), // 107: productv1.ActionInput - (*ActionResult)(nil), // 108: productv1.ActionResult - (*NullableFieldsInput)(nil), // 109: productv1.NullableFieldsInput - (*BlogPostInput)(nil), // 110: productv1.BlogPostInput - (*AuthorInput)(nil), // 111: productv1.AuthorInput - (*NestedTypeB)(nil), // 112: productv1.NestedTypeB - (*NestedTypeC)(nil), // 113: productv1.NestedTypeC - (*FilterType)(nil), // 114: productv1.FilterType - (*Pagination)(nil), // 115: productv1.Pagination - (*OrderLineInput)(nil), // 116: productv1.OrderLineInput - (*OrderLine)(nil), // 117: productv1.OrderLine - (*Cat)(nil), // 118: productv1.Cat - (*Dog)(nil), // 119: productv1.Dog - (*ActionSuccess)(nil), // 120: productv1.ActionSuccess - (*ActionError)(nil), // 121: productv1.ActionError - (*CategoryInput)(nil), // 122: productv1.CategoryInput - (*ListOfListOfString_List)(nil), // 123: productv1.ListOfListOfString.List - (*wrapperspb.Int32Value)(nil), // 124: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 125: google.protobuf.StringValue - (*wrapperspb.DoubleValue)(nil), // 126: google.protobuf.DoubleValue - (*wrapperspb.BoolValue)(nil), // 127: google.protobuf.BoolValue + (*ListOfBlogPost)(nil), // 1: productv1.ListOfBlogPost + (*ListOfBoolean)(nil), // 2: productv1.ListOfBoolean + (*ListOfCategory)(nil), // 3: productv1.ListOfCategory + (*ListOfCategoryInput)(nil), // 4: productv1.ListOfCategoryInput + (*ListOfFloat)(nil), // 5: productv1.ListOfFloat + (*ListOfListOfCategory)(nil), // 6: productv1.ListOfListOfCategory + (*ListOfListOfCategoryInput)(nil), // 7: productv1.ListOfListOfCategoryInput + (*ListOfListOfString)(nil), // 8: productv1.ListOfListOfString + (*ListOfListOfUser)(nil), // 9: productv1.ListOfListOfUser + (*ListOfListOfUserInput)(nil), // 10: productv1.ListOfListOfUserInput + (*ListOfOrderLine)(nil), // 11: productv1.ListOfOrderLine + (*ListOfProduct)(nil), // 12: productv1.ListOfProduct + (*ListOfString)(nil), // 13: productv1.ListOfString + (*ListOfUser)(nil), // 14: productv1.ListOfUser + (*ListOfUserInput)(nil), // 15: productv1.ListOfUserInput + (*LookupProductByIdRequestKey)(nil), // 16: productv1.LookupProductByIdRequestKey + (*LookupProductByIdRequest)(nil), // 17: productv1.LookupProductByIdRequest + (*LookupProductByIdResponse)(nil), // 18: productv1.LookupProductByIdResponse + (*LookupStorageByIdRequestKey)(nil), // 19: productv1.LookupStorageByIdRequestKey + (*LookupStorageByIdRequest)(nil), // 20: productv1.LookupStorageByIdRequest + (*LookupStorageByIdResponse)(nil), // 21: productv1.LookupStorageByIdResponse + (*QueryUsersRequest)(nil), // 22: productv1.QueryUsersRequest + (*QueryUsersResponse)(nil), // 23: productv1.QueryUsersResponse + (*QueryUserRequest)(nil), // 24: productv1.QueryUserRequest + (*QueryUserResponse)(nil), // 25: productv1.QueryUserResponse + (*QueryNestedTypeRequest)(nil), // 26: productv1.QueryNestedTypeRequest + (*QueryNestedTypeResponse)(nil), // 27: productv1.QueryNestedTypeResponse + (*QueryRecursiveTypeRequest)(nil), // 28: productv1.QueryRecursiveTypeRequest + (*QueryRecursiveTypeResponse)(nil), // 29: productv1.QueryRecursiveTypeResponse + (*QueryTypeFilterWithArgumentsRequest)(nil), // 30: productv1.QueryTypeFilterWithArgumentsRequest + (*QueryTypeFilterWithArgumentsResponse)(nil), // 31: productv1.QueryTypeFilterWithArgumentsResponse + (*QueryTypeWithMultipleFilterFieldsRequest)(nil), // 32: productv1.QueryTypeWithMultipleFilterFieldsRequest + (*QueryTypeWithMultipleFilterFieldsResponse)(nil), // 33: productv1.QueryTypeWithMultipleFilterFieldsResponse + (*QueryComplexFilterTypeRequest)(nil), // 34: productv1.QueryComplexFilterTypeRequest + (*QueryComplexFilterTypeResponse)(nil), // 35: productv1.QueryComplexFilterTypeResponse + (*QueryCalculateTotalsRequest)(nil), // 36: productv1.QueryCalculateTotalsRequest + (*QueryCalculateTotalsResponse)(nil), // 37: productv1.QueryCalculateTotalsResponse + (*QueryCategoriesRequest)(nil), // 38: productv1.QueryCategoriesRequest + (*QueryCategoriesResponse)(nil), // 39: productv1.QueryCategoriesResponse + (*QueryCategoriesByKindRequest)(nil), // 40: productv1.QueryCategoriesByKindRequest + (*QueryCategoriesByKindResponse)(nil), // 41: productv1.QueryCategoriesByKindResponse + (*QueryCategoriesByKindsRequest)(nil), // 42: productv1.QueryCategoriesByKindsRequest + (*QueryCategoriesByKindsResponse)(nil), // 43: productv1.QueryCategoriesByKindsResponse + (*QueryFilterCategoriesRequest)(nil), // 44: productv1.QueryFilterCategoriesRequest + (*QueryFilterCategoriesResponse)(nil), // 45: productv1.QueryFilterCategoriesResponse + (*QueryRandomPetRequest)(nil), // 46: productv1.QueryRandomPetRequest + (*QueryRandomPetResponse)(nil), // 47: productv1.QueryRandomPetResponse + (*QueryAllPetsRequest)(nil), // 48: productv1.QueryAllPetsRequest + (*QueryAllPetsResponse)(nil), // 49: productv1.QueryAllPetsResponse + (*QuerySearchRequest)(nil), // 50: productv1.QuerySearchRequest + (*QuerySearchResponse)(nil), // 51: productv1.QuerySearchResponse + (*QueryRandomSearchResultRequest)(nil), // 52: productv1.QueryRandomSearchResultRequest + (*QueryRandomSearchResultResponse)(nil), // 53: productv1.QueryRandomSearchResultResponse + (*QueryNullableFieldsTypeRequest)(nil), // 54: productv1.QueryNullableFieldsTypeRequest + (*QueryNullableFieldsTypeResponse)(nil), // 55: productv1.QueryNullableFieldsTypeResponse + (*QueryNullableFieldsTypeByIdRequest)(nil), // 56: productv1.QueryNullableFieldsTypeByIdRequest + (*QueryNullableFieldsTypeByIdResponse)(nil), // 57: productv1.QueryNullableFieldsTypeByIdResponse + (*QueryNullableFieldsTypeWithFilterRequest)(nil), // 58: productv1.QueryNullableFieldsTypeWithFilterRequest + (*QueryNullableFieldsTypeWithFilterResponse)(nil), // 59: productv1.QueryNullableFieldsTypeWithFilterResponse + (*QueryAllNullableFieldsTypesRequest)(nil), // 60: productv1.QueryAllNullableFieldsTypesRequest + (*QueryAllNullableFieldsTypesResponse)(nil), // 61: productv1.QueryAllNullableFieldsTypesResponse + (*QueryBlogPostRequest)(nil), // 62: productv1.QueryBlogPostRequest + (*QueryBlogPostResponse)(nil), // 63: productv1.QueryBlogPostResponse + (*QueryBlogPostByIdRequest)(nil), // 64: productv1.QueryBlogPostByIdRequest + (*QueryBlogPostByIdResponse)(nil), // 65: productv1.QueryBlogPostByIdResponse + (*QueryBlogPostsWithFilterRequest)(nil), // 66: productv1.QueryBlogPostsWithFilterRequest + (*QueryBlogPostsWithFilterResponse)(nil), // 67: productv1.QueryBlogPostsWithFilterResponse + (*QueryAllBlogPostsRequest)(nil), // 68: productv1.QueryAllBlogPostsRequest + (*QueryAllBlogPostsResponse)(nil), // 69: productv1.QueryAllBlogPostsResponse + (*QueryAuthorRequest)(nil), // 70: productv1.QueryAuthorRequest + (*QueryAuthorResponse)(nil), // 71: productv1.QueryAuthorResponse + (*QueryAuthorByIdRequest)(nil), // 72: productv1.QueryAuthorByIdRequest + (*QueryAuthorByIdResponse)(nil), // 73: productv1.QueryAuthorByIdResponse + (*QueryAuthorsWithFilterRequest)(nil), // 74: productv1.QueryAuthorsWithFilterRequest + (*QueryAuthorsWithFilterResponse)(nil), // 75: productv1.QueryAuthorsWithFilterResponse + (*QueryAllAuthorsRequest)(nil), // 76: productv1.QueryAllAuthorsRequest + (*QueryAllAuthorsResponse)(nil), // 77: productv1.QueryAllAuthorsResponse + (*MutationCreateUserRequest)(nil), // 78: productv1.MutationCreateUserRequest + (*MutationCreateUserResponse)(nil), // 79: productv1.MutationCreateUserResponse + (*MutationPerformActionRequest)(nil), // 80: productv1.MutationPerformActionRequest + (*MutationPerformActionResponse)(nil), // 81: productv1.MutationPerformActionResponse + (*MutationCreateNullableFieldsTypeRequest)(nil), // 82: productv1.MutationCreateNullableFieldsTypeRequest + (*MutationCreateNullableFieldsTypeResponse)(nil), // 83: productv1.MutationCreateNullableFieldsTypeResponse + (*MutationUpdateNullableFieldsTypeRequest)(nil), // 84: productv1.MutationUpdateNullableFieldsTypeRequest + (*MutationUpdateNullableFieldsTypeResponse)(nil), // 85: productv1.MutationUpdateNullableFieldsTypeResponse + (*MutationCreateBlogPostRequest)(nil), // 86: productv1.MutationCreateBlogPostRequest + (*MutationCreateBlogPostResponse)(nil), // 87: productv1.MutationCreateBlogPostResponse + (*MutationUpdateBlogPostRequest)(nil), // 88: productv1.MutationUpdateBlogPostRequest + (*MutationUpdateBlogPostResponse)(nil), // 89: productv1.MutationUpdateBlogPostResponse + (*MutationCreateAuthorRequest)(nil), // 90: productv1.MutationCreateAuthorRequest + (*MutationCreateAuthorResponse)(nil), // 91: productv1.MutationCreateAuthorResponse + (*MutationUpdateAuthorRequest)(nil), // 92: productv1.MutationUpdateAuthorRequest + (*MutationUpdateAuthorResponse)(nil), // 93: productv1.MutationUpdateAuthorResponse + (*Product)(nil), // 94: productv1.Product + (*Storage)(nil), // 95: productv1.Storage + (*User)(nil), // 96: productv1.User + (*NestedTypeA)(nil), // 97: productv1.NestedTypeA + (*RecursiveType)(nil), // 98: productv1.RecursiveType + (*TypeWithMultipleFilterFields)(nil), // 99: productv1.TypeWithMultipleFilterFields + (*FilterTypeInput)(nil), // 100: productv1.FilterTypeInput + (*ComplexFilterTypeInput)(nil), // 101: productv1.ComplexFilterTypeInput + (*TypeWithComplexFilterInput)(nil), // 102: productv1.TypeWithComplexFilterInput + (*OrderInput)(nil), // 103: productv1.OrderInput + (*Order)(nil), // 104: productv1.Order + (*Category)(nil), // 105: productv1.Category + (*CategoryFilter)(nil), // 106: productv1.CategoryFilter + (*Animal)(nil), // 107: productv1.Animal + (*SearchInput)(nil), // 108: productv1.SearchInput + (*SearchResult)(nil), // 109: productv1.SearchResult + (*NullableFieldsType)(nil), // 110: productv1.NullableFieldsType + (*NullableFieldsFilter)(nil), // 111: productv1.NullableFieldsFilter + (*BlogPost)(nil), // 112: productv1.BlogPost + (*BlogPostFilter)(nil), // 113: productv1.BlogPostFilter + (*Author)(nil), // 114: productv1.Author + (*AuthorFilter)(nil), // 115: productv1.AuthorFilter + (*UserInput)(nil), // 116: productv1.UserInput + (*ActionInput)(nil), // 117: productv1.ActionInput + (*ActionResult)(nil), // 118: productv1.ActionResult + (*NullableFieldsInput)(nil), // 119: productv1.NullableFieldsInput + (*BlogPostInput)(nil), // 120: productv1.BlogPostInput + (*AuthorInput)(nil), // 121: productv1.AuthorInput + (*NestedTypeB)(nil), // 122: productv1.NestedTypeB + (*NestedTypeC)(nil), // 123: productv1.NestedTypeC + (*FilterType)(nil), // 124: productv1.FilterType + (*Pagination)(nil), // 125: productv1.Pagination + (*OrderLineInput)(nil), // 126: productv1.OrderLineInput + (*OrderLine)(nil), // 127: productv1.OrderLine + (*Cat)(nil), // 128: productv1.Cat + (*Dog)(nil), // 129: productv1.Dog + (*ActionSuccess)(nil), // 130: productv1.ActionSuccess + (*ActionError)(nil), // 131: productv1.ActionError + (*CategoryInput)(nil), // 132: productv1.CategoryInput + (*ListOfListOfCategory_List)(nil), // 133: productv1.ListOfListOfCategory.List + (*ListOfListOfCategoryInput_List)(nil), // 134: productv1.ListOfListOfCategoryInput.List + (*ListOfListOfString_List)(nil), // 135: productv1.ListOfListOfString.List + (*ListOfListOfUser_List)(nil), // 136: productv1.ListOfListOfUser.List + (*ListOfListOfUserInput_List)(nil), // 137: productv1.ListOfListOfUserInput.List + (*wrapperspb.Int32Value)(nil), // 138: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 139: google.protobuf.StringValue + (*wrapperspb.DoubleValue)(nil), // 140: google.protobuf.DoubleValue + (*wrapperspb.BoolValue)(nil), // 141: google.protobuf.BoolValue } var file_product_proto_depIdxs = []int32{ - 123, // 0: productv1.ListOfListOfString.list:type_name -> productv1.ListOfListOfString.List - 117, // 1: productv1.ListOfOrderLine.items:type_name -> productv1.OrderLine - 6, // 2: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey - 84, // 3: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product - 9, // 4: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey - 85, // 5: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage - 86, // 6: productv1.QueryUsersResponse.users:type_name -> productv1.User - 86, // 7: productv1.QueryUserResponse.user:type_name -> productv1.User - 87, // 8: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA - 88, // 9: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType - 89, // 10: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields - 90, // 11: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput - 89, // 12: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields - 91, // 13: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput - 92, // 14: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput - 93, // 15: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput - 94, // 16: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order - 95, // 17: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category - 0, // 18: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind - 95, // 19: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category - 0, // 20: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind - 95, // 21: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category - 96, // 22: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter - 95, // 23: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category - 97, // 24: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal - 97, // 25: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal - 98, // 26: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput - 99, // 27: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult - 99, // 28: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult - 100, // 29: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType - 100, // 30: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType - 101, // 31: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter - 100, // 32: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType - 100, // 33: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType - 102, // 34: productv1.QueryBlogPostResponse.blog_post:type_name -> productv1.BlogPost - 102, // 35: productv1.QueryBlogPostByIdResponse.blog_post_by_id:type_name -> productv1.BlogPost - 103, // 36: productv1.QueryBlogPostsWithFilterRequest.filter:type_name -> productv1.BlogPostFilter - 102, // 37: productv1.QueryBlogPostsWithFilterResponse.blog_posts_with_filter:type_name -> productv1.BlogPost - 102, // 38: productv1.QueryAllBlogPostsResponse.all_blog_posts:type_name -> productv1.BlogPost - 104, // 39: productv1.QueryAuthorResponse.author:type_name -> productv1.Author - 104, // 40: productv1.QueryAuthorByIdResponse.author_by_id:type_name -> productv1.Author - 105, // 41: productv1.QueryAuthorsWithFilterRequest.filter:type_name -> productv1.AuthorFilter - 104, // 42: productv1.QueryAuthorsWithFilterResponse.authors_with_filter:type_name -> productv1.Author - 104, // 43: productv1.QueryAllAuthorsResponse.all_authors:type_name -> productv1.Author - 106, // 44: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput - 86, // 45: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User - 107, // 46: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput - 108, // 47: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult - 109, // 48: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 100, // 49: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType - 109, // 50: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 100, // 51: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType - 110, // 52: productv1.MutationCreateBlogPostRequest.input:type_name -> productv1.BlogPostInput - 102, // 53: productv1.MutationCreateBlogPostResponse.create_blog_post:type_name -> productv1.BlogPost - 110, // 54: productv1.MutationUpdateBlogPostRequest.input:type_name -> productv1.BlogPostInput - 102, // 55: productv1.MutationUpdateBlogPostResponse.update_blog_post:type_name -> productv1.BlogPost - 111, // 56: productv1.MutationCreateAuthorRequest.input:type_name -> productv1.AuthorInput - 104, // 57: productv1.MutationCreateAuthorResponse.create_author:type_name -> productv1.Author - 111, // 58: productv1.MutationUpdateAuthorRequest.input:type_name -> productv1.AuthorInput - 104, // 59: productv1.MutationUpdateAuthorResponse.update_author:type_name -> productv1.Author - 112, // 60: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB - 88, // 61: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType - 114, // 62: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType - 116, // 63: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput - 4, // 64: productv1.Order.order_lines:type_name -> productv1.ListOfOrderLine - 0, // 65: productv1.Category.kind:type_name -> productv1.CategoryKind - 0, // 66: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind - 115, // 67: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination - 118, // 68: productv1.Animal.cat:type_name -> productv1.Cat - 119, // 69: productv1.Animal.dog:type_name -> productv1.Dog - 124, // 70: productv1.SearchInput.limit:type_name -> google.protobuf.Int32Value - 84, // 71: productv1.SearchResult.product:type_name -> productv1.Product - 86, // 72: productv1.SearchResult.user:type_name -> productv1.User - 95, // 73: productv1.SearchResult.category:type_name -> productv1.Category - 125, // 74: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue - 124, // 75: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value - 126, // 76: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.DoubleValue - 127, // 77: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue - 125, // 78: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue - 125, // 79: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue - 127, // 80: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue - 5, // 81: productv1.BlogPost.optional_tags:type_name -> productv1.ListOfString - 5, // 82: productv1.BlogPost.keywords:type_name -> productv1.ListOfString - 2, // 83: productv1.BlogPost.ratings:type_name -> productv1.ListOfFloat - 1, // 84: productv1.BlogPost.is_published:type_name -> productv1.ListOfBoolean - 3, // 85: productv1.BlogPost.tag_groups:type_name -> productv1.ListOfListOfString - 3, // 86: productv1.BlogPost.related_topics:type_name -> productv1.ListOfListOfString - 3, // 87: productv1.BlogPost.comment_threads:type_name -> productv1.ListOfListOfString - 3, // 88: productv1.BlogPost.suggestions:type_name -> productv1.ListOfListOfString - 125, // 89: productv1.BlogPostFilter.title:type_name -> google.protobuf.StringValue - 127, // 90: productv1.BlogPostFilter.has_categories:type_name -> google.protobuf.BoolValue - 124, // 91: productv1.BlogPostFilter.min_tags:type_name -> google.protobuf.Int32Value - 125, // 92: productv1.Author.email:type_name -> google.protobuf.StringValue - 5, // 93: productv1.Author.social_links:type_name -> productv1.ListOfString - 3, // 94: productv1.Author.teams_by_project:type_name -> productv1.ListOfListOfString - 3, // 95: productv1.Author.collaborations:type_name -> productv1.ListOfListOfString - 125, // 96: productv1.AuthorFilter.name:type_name -> google.protobuf.StringValue - 127, // 97: productv1.AuthorFilter.has_teams:type_name -> google.protobuf.BoolValue - 124, // 98: productv1.AuthorFilter.skill_count:type_name -> google.protobuf.Int32Value - 120, // 99: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess - 121, // 100: productv1.ActionResult.action_error:type_name -> productv1.ActionError - 125, // 101: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue - 124, // 102: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value - 126, // 103: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.DoubleValue - 127, // 104: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue - 5, // 105: productv1.BlogPostInput.optional_tags:type_name -> productv1.ListOfString - 5, // 106: productv1.BlogPostInput.keywords:type_name -> productv1.ListOfString - 2, // 107: productv1.BlogPostInput.ratings:type_name -> productv1.ListOfFloat - 1, // 108: productv1.BlogPostInput.is_published:type_name -> productv1.ListOfBoolean - 3, // 109: productv1.BlogPostInput.tag_groups:type_name -> productv1.ListOfListOfString - 3, // 110: productv1.BlogPostInput.related_topics:type_name -> productv1.ListOfListOfString - 3, // 111: productv1.BlogPostInput.comment_threads:type_name -> productv1.ListOfListOfString - 3, // 112: productv1.BlogPostInput.suggestions:type_name -> productv1.ListOfListOfString - 125, // 113: productv1.AuthorInput.email:type_name -> google.protobuf.StringValue - 5, // 114: productv1.AuthorInput.social_links:type_name -> productv1.ListOfString - 3, // 115: productv1.AuthorInput.teams_by_project:type_name -> productv1.ListOfListOfString - 3, // 116: productv1.AuthorInput.collaborations:type_name -> productv1.ListOfListOfString - 113, // 117: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC - 115, // 118: productv1.FilterType.pagination:type_name -> productv1.Pagination - 5, // 119: productv1.OrderLineInput.modifiers:type_name -> productv1.ListOfString - 5, // 120: productv1.OrderLine.modifiers:type_name -> productv1.ListOfString - 0, // 121: productv1.CategoryInput.kind:type_name -> productv1.CategoryKind - 5, // 122: productv1.ListOfListOfString.List.items:type_name -> productv1.ListOfString - 7, // 123: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest - 10, // 124: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest - 80, // 125: productv1.ProductService.MutationCreateAuthor:input_type -> productv1.MutationCreateAuthorRequest - 76, // 126: productv1.ProductService.MutationCreateBlogPost:input_type -> productv1.MutationCreateBlogPostRequest - 72, // 127: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest - 68, // 128: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest - 70, // 129: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest - 82, // 130: productv1.ProductService.MutationUpdateAuthor:input_type -> productv1.MutationUpdateAuthorRequest - 78, // 131: productv1.ProductService.MutationUpdateBlogPost:input_type -> productv1.MutationUpdateBlogPostRequest - 74, // 132: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest - 66, // 133: productv1.ProductService.QueryAllAuthors:input_type -> productv1.QueryAllAuthorsRequest - 58, // 134: productv1.ProductService.QueryAllBlogPosts:input_type -> productv1.QueryAllBlogPostsRequest - 50, // 135: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest - 38, // 136: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest - 60, // 137: productv1.ProductService.QueryAuthor:input_type -> productv1.QueryAuthorRequest - 62, // 138: productv1.ProductService.QueryAuthorById:input_type -> productv1.QueryAuthorByIdRequest - 64, // 139: productv1.ProductService.QueryAuthorsWithFilter:input_type -> productv1.QueryAuthorsWithFilterRequest - 52, // 140: productv1.ProductService.QueryBlogPost:input_type -> productv1.QueryBlogPostRequest - 54, // 141: productv1.ProductService.QueryBlogPostById:input_type -> productv1.QueryBlogPostByIdRequest - 56, // 142: productv1.ProductService.QueryBlogPostsWithFilter:input_type -> productv1.QueryBlogPostsWithFilterRequest - 26, // 143: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest - 28, // 144: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest - 30, // 145: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest - 32, // 146: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest - 24, // 147: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest - 34, // 148: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest - 16, // 149: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest - 44, // 150: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest - 46, // 151: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest - 48, // 152: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest - 36, // 153: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest - 42, // 154: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest - 18, // 155: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest - 40, // 156: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest - 20, // 157: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest - 22, // 158: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest - 14, // 159: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest - 12, // 160: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest - 8, // 161: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse - 11, // 162: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse - 81, // 163: productv1.ProductService.MutationCreateAuthor:output_type -> productv1.MutationCreateAuthorResponse - 77, // 164: productv1.ProductService.MutationCreateBlogPost:output_type -> productv1.MutationCreateBlogPostResponse - 73, // 165: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse - 69, // 166: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse - 71, // 167: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse - 83, // 168: productv1.ProductService.MutationUpdateAuthor:output_type -> productv1.MutationUpdateAuthorResponse - 79, // 169: productv1.ProductService.MutationUpdateBlogPost:output_type -> productv1.MutationUpdateBlogPostResponse - 75, // 170: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse - 67, // 171: productv1.ProductService.QueryAllAuthors:output_type -> productv1.QueryAllAuthorsResponse - 59, // 172: productv1.ProductService.QueryAllBlogPosts:output_type -> productv1.QueryAllBlogPostsResponse - 51, // 173: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse - 39, // 174: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse - 61, // 175: productv1.ProductService.QueryAuthor:output_type -> productv1.QueryAuthorResponse - 63, // 176: productv1.ProductService.QueryAuthorById:output_type -> productv1.QueryAuthorByIdResponse - 65, // 177: productv1.ProductService.QueryAuthorsWithFilter:output_type -> productv1.QueryAuthorsWithFilterResponse - 53, // 178: productv1.ProductService.QueryBlogPost:output_type -> productv1.QueryBlogPostResponse - 55, // 179: productv1.ProductService.QueryBlogPostById:output_type -> productv1.QueryBlogPostByIdResponse - 57, // 180: productv1.ProductService.QueryBlogPostsWithFilter:output_type -> productv1.QueryBlogPostsWithFilterResponse - 27, // 181: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse - 29, // 182: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse - 31, // 183: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse - 33, // 184: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse - 25, // 185: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse - 35, // 186: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse - 17, // 187: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse - 45, // 188: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse - 47, // 189: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse - 49, // 190: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse - 37, // 191: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse - 43, // 192: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse - 19, // 193: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse - 41, // 194: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse - 21, // 195: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse - 23, // 196: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse - 15, // 197: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse - 13, // 198: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse - 161, // [161:199] is the sub-list for method output_type - 123, // [123:161] is the sub-list for method input_type - 123, // [123:123] is the sub-list for extension type_name - 123, // [123:123] is the sub-list for extension extendee - 0, // [0:123] is the sub-list for field type_name + 112, // 0: productv1.ListOfBlogPost.items:type_name -> productv1.BlogPost + 105, // 1: productv1.ListOfCategory.items:type_name -> productv1.Category + 132, // 2: productv1.ListOfCategoryInput.items:type_name -> productv1.CategoryInput + 133, // 3: productv1.ListOfListOfCategory.list:type_name -> productv1.ListOfListOfCategory.List + 134, // 4: productv1.ListOfListOfCategoryInput.list:type_name -> productv1.ListOfListOfCategoryInput.List + 135, // 5: productv1.ListOfListOfString.list:type_name -> productv1.ListOfListOfString.List + 136, // 6: productv1.ListOfListOfUser.list:type_name -> productv1.ListOfListOfUser.List + 137, // 7: productv1.ListOfListOfUserInput.list:type_name -> productv1.ListOfListOfUserInput.List + 127, // 8: productv1.ListOfOrderLine.items:type_name -> productv1.OrderLine + 94, // 9: productv1.ListOfProduct.items:type_name -> productv1.Product + 96, // 10: productv1.ListOfUser.items:type_name -> productv1.User + 116, // 11: productv1.ListOfUserInput.items:type_name -> productv1.UserInput + 16, // 12: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey + 94, // 13: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product + 19, // 14: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey + 95, // 15: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage + 96, // 16: productv1.QueryUsersResponse.users:type_name -> productv1.User + 96, // 17: productv1.QueryUserResponse.user:type_name -> productv1.User + 97, // 18: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA + 98, // 19: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType + 99, // 20: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields + 100, // 21: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput + 99, // 22: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields + 101, // 23: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput + 102, // 24: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput + 103, // 25: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput + 104, // 26: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order + 105, // 27: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category + 0, // 28: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind + 105, // 29: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category + 0, // 30: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind + 105, // 31: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category + 106, // 32: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter + 105, // 33: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category + 107, // 34: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal + 107, // 35: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal + 108, // 36: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput + 109, // 37: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult + 109, // 38: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult + 110, // 39: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType + 110, // 40: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType + 111, // 41: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter + 110, // 42: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType + 110, // 43: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType + 112, // 44: productv1.QueryBlogPostResponse.blog_post:type_name -> productv1.BlogPost + 112, // 45: productv1.QueryBlogPostByIdResponse.blog_post_by_id:type_name -> productv1.BlogPost + 113, // 46: productv1.QueryBlogPostsWithFilterRequest.filter:type_name -> productv1.BlogPostFilter + 112, // 47: productv1.QueryBlogPostsWithFilterResponse.blog_posts_with_filter:type_name -> productv1.BlogPost + 112, // 48: productv1.QueryAllBlogPostsResponse.all_blog_posts:type_name -> productv1.BlogPost + 114, // 49: productv1.QueryAuthorResponse.author:type_name -> productv1.Author + 114, // 50: productv1.QueryAuthorByIdResponse.author_by_id:type_name -> productv1.Author + 115, // 51: productv1.QueryAuthorsWithFilterRequest.filter:type_name -> productv1.AuthorFilter + 114, // 52: productv1.QueryAuthorsWithFilterResponse.authors_with_filter:type_name -> productv1.Author + 114, // 53: productv1.QueryAllAuthorsResponse.all_authors:type_name -> productv1.Author + 116, // 54: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput + 96, // 55: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User + 117, // 56: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput + 118, // 57: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult + 119, // 58: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 110, // 59: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType + 119, // 60: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 110, // 61: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType + 120, // 62: productv1.MutationCreateBlogPostRequest.input:type_name -> productv1.BlogPostInput + 112, // 63: productv1.MutationCreateBlogPostResponse.create_blog_post:type_name -> productv1.BlogPost + 120, // 64: productv1.MutationUpdateBlogPostRequest.input:type_name -> productv1.BlogPostInput + 112, // 65: productv1.MutationUpdateBlogPostResponse.update_blog_post:type_name -> productv1.BlogPost + 121, // 66: productv1.MutationCreateAuthorRequest.input:type_name -> productv1.AuthorInput + 114, // 67: productv1.MutationCreateAuthorResponse.create_author:type_name -> productv1.Author + 121, // 68: productv1.MutationUpdateAuthorRequest.input:type_name -> productv1.AuthorInput + 114, // 69: productv1.MutationUpdateAuthorResponse.update_author:type_name -> productv1.Author + 122, // 70: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB + 98, // 71: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType + 124, // 72: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType + 126, // 73: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput + 11, // 74: productv1.Order.order_lines:type_name -> productv1.ListOfOrderLine + 0, // 75: productv1.Category.kind:type_name -> productv1.CategoryKind + 0, // 76: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind + 125, // 77: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination + 128, // 78: productv1.Animal.cat:type_name -> productv1.Cat + 129, // 79: productv1.Animal.dog:type_name -> productv1.Dog + 138, // 80: productv1.SearchInput.limit:type_name -> google.protobuf.Int32Value + 94, // 81: productv1.SearchResult.product:type_name -> productv1.Product + 96, // 82: productv1.SearchResult.user:type_name -> productv1.User + 105, // 83: productv1.SearchResult.category:type_name -> productv1.Category + 139, // 84: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue + 138, // 85: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value + 140, // 86: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.DoubleValue + 141, // 87: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue + 139, // 88: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue + 139, // 89: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue + 141, // 90: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue + 13, // 91: productv1.BlogPost.optional_tags:type_name -> productv1.ListOfString + 13, // 92: productv1.BlogPost.keywords:type_name -> productv1.ListOfString + 5, // 93: productv1.BlogPost.ratings:type_name -> productv1.ListOfFloat + 2, // 94: productv1.BlogPost.is_published:type_name -> productv1.ListOfBoolean + 8, // 95: productv1.BlogPost.tag_groups:type_name -> productv1.ListOfListOfString + 8, // 96: productv1.BlogPost.related_topics:type_name -> productv1.ListOfListOfString + 8, // 97: productv1.BlogPost.comment_threads:type_name -> productv1.ListOfListOfString + 8, // 98: productv1.BlogPost.suggestions:type_name -> productv1.ListOfListOfString + 105, // 99: productv1.BlogPost.related_categories:type_name -> productv1.Category + 96, // 100: productv1.BlogPost.contributors:type_name -> productv1.User + 12, // 101: productv1.BlogPost.mentioned_products:type_name -> productv1.ListOfProduct + 14, // 102: productv1.BlogPost.mentioned_users:type_name -> productv1.ListOfUser + 6, // 103: productv1.BlogPost.category_groups:type_name -> productv1.ListOfListOfCategory + 9, // 104: productv1.BlogPost.contributor_teams:type_name -> productv1.ListOfListOfUser + 139, // 105: productv1.BlogPostFilter.title:type_name -> google.protobuf.StringValue + 141, // 106: productv1.BlogPostFilter.has_categories:type_name -> google.protobuf.BoolValue + 138, // 107: productv1.BlogPostFilter.min_tags:type_name -> google.protobuf.Int32Value + 139, // 108: productv1.Author.email:type_name -> google.protobuf.StringValue + 13, // 109: productv1.Author.social_links:type_name -> productv1.ListOfString + 8, // 110: productv1.Author.teams_by_project:type_name -> productv1.ListOfListOfString + 8, // 111: productv1.Author.collaborations:type_name -> productv1.ListOfListOfString + 1, // 112: productv1.Author.written_posts:type_name -> productv1.ListOfBlogPost + 105, // 113: productv1.Author.favorite_categories:type_name -> productv1.Category + 14, // 114: productv1.Author.related_authors:type_name -> productv1.ListOfUser + 12, // 115: productv1.Author.product_reviews:type_name -> productv1.ListOfProduct + 9, // 116: productv1.Author.author_groups:type_name -> productv1.ListOfListOfUser + 6, // 117: productv1.Author.category_preferences:type_name -> productv1.ListOfListOfCategory + 9, // 118: productv1.Author.project_teams:type_name -> productv1.ListOfListOfUser + 139, // 119: productv1.AuthorFilter.name:type_name -> google.protobuf.StringValue + 141, // 120: productv1.AuthorFilter.has_teams:type_name -> google.protobuf.BoolValue + 138, // 121: productv1.AuthorFilter.skill_count:type_name -> google.protobuf.Int32Value + 130, // 122: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess + 131, // 123: productv1.ActionResult.action_error:type_name -> productv1.ActionError + 139, // 124: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue + 138, // 125: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value + 140, // 126: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.DoubleValue + 141, // 127: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue + 13, // 128: productv1.BlogPostInput.optional_tags:type_name -> productv1.ListOfString + 13, // 129: productv1.BlogPostInput.keywords:type_name -> productv1.ListOfString + 5, // 130: productv1.BlogPostInput.ratings:type_name -> productv1.ListOfFloat + 2, // 131: productv1.BlogPostInput.is_published:type_name -> productv1.ListOfBoolean + 8, // 132: productv1.BlogPostInput.tag_groups:type_name -> productv1.ListOfListOfString + 8, // 133: productv1.BlogPostInput.related_topics:type_name -> productv1.ListOfListOfString + 8, // 134: productv1.BlogPostInput.comment_threads:type_name -> productv1.ListOfListOfString + 8, // 135: productv1.BlogPostInput.suggestions:type_name -> productv1.ListOfListOfString + 4, // 136: productv1.BlogPostInput.related_categories:type_name -> productv1.ListOfCategoryInput + 15, // 137: productv1.BlogPostInput.contributors:type_name -> productv1.ListOfUserInput + 7, // 138: productv1.BlogPostInput.category_groups:type_name -> productv1.ListOfListOfCategoryInput + 139, // 139: productv1.AuthorInput.email:type_name -> google.protobuf.StringValue + 13, // 140: productv1.AuthorInput.social_links:type_name -> productv1.ListOfString + 8, // 141: productv1.AuthorInput.teams_by_project:type_name -> productv1.ListOfListOfString + 8, // 142: productv1.AuthorInput.collaborations:type_name -> productv1.ListOfListOfString + 132, // 143: productv1.AuthorInput.favorite_categories:type_name -> productv1.CategoryInput + 10, // 144: productv1.AuthorInput.author_groups:type_name -> productv1.ListOfListOfUserInput + 10, // 145: productv1.AuthorInput.project_teams:type_name -> productv1.ListOfListOfUserInput + 123, // 146: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC + 125, // 147: productv1.FilterType.pagination:type_name -> productv1.Pagination + 13, // 148: productv1.OrderLineInput.modifiers:type_name -> productv1.ListOfString + 13, // 149: productv1.OrderLine.modifiers:type_name -> productv1.ListOfString + 0, // 150: productv1.CategoryInput.kind:type_name -> productv1.CategoryKind + 3, // 151: productv1.ListOfListOfCategory.List.items:type_name -> productv1.ListOfCategory + 4, // 152: productv1.ListOfListOfCategoryInput.List.items:type_name -> productv1.ListOfCategoryInput + 13, // 153: productv1.ListOfListOfString.List.items:type_name -> productv1.ListOfString + 14, // 154: productv1.ListOfListOfUser.List.items:type_name -> productv1.ListOfUser + 15, // 155: productv1.ListOfListOfUserInput.List.items:type_name -> productv1.ListOfUserInput + 17, // 156: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest + 20, // 157: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest + 90, // 158: productv1.ProductService.MutationCreateAuthor:input_type -> productv1.MutationCreateAuthorRequest + 86, // 159: productv1.ProductService.MutationCreateBlogPost:input_type -> productv1.MutationCreateBlogPostRequest + 82, // 160: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest + 78, // 161: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest + 80, // 162: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest + 92, // 163: productv1.ProductService.MutationUpdateAuthor:input_type -> productv1.MutationUpdateAuthorRequest + 88, // 164: productv1.ProductService.MutationUpdateBlogPost:input_type -> productv1.MutationUpdateBlogPostRequest + 84, // 165: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest + 76, // 166: productv1.ProductService.QueryAllAuthors:input_type -> productv1.QueryAllAuthorsRequest + 68, // 167: productv1.ProductService.QueryAllBlogPosts:input_type -> productv1.QueryAllBlogPostsRequest + 60, // 168: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest + 48, // 169: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest + 70, // 170: productv1.ProductService.QueryAuthor:input_type -> productv1.QueryAuthorRequest + 72, // 171: productv1.ProductService.QueryAuthorById:input_type -> productv1.QueryAuthorByIdRequest + 74, // 172: productv1.ProductService.QueryAuthorsWithFilter:input_type -> productv1.QueryAuthorsWithFilterRequest + 62, // 173: productv1.ProductService.QueryBlogPost:input_type -> productv1.QueryBlogPostRequest + 64, // 174: productv1.ProductService.QueryBlogPostById:input_type -> productv1.QueryBlogPostByIdRequest + 66, // 175: productv1.ProductService.QueryBlogPostsWithFilter:input_type -> productv1.QueryBlogPostsWithFilterRequest + 36, // 176: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest + 38, // 177: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest + 40, // 178: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest + 42, // 179: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest + 34, // 180: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest + 44, // 181: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest + 26, // 182: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest + 54, // 183: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest + 56, // 184: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest + 58, // 185: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest + 46, // 186: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest + 52, // 187: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest + 28, // 188: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest + 50, // 189: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest + 30, // 190: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest + 32, // 191: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest + 24, // 192: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest + 22, // 193: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest + 18, // 194: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse + 21, // 195: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse + 91, // 196: productv1.ProductService.MutationCreateAuthor:output_type -> productv1.MutationCreateAuthorResponse + 87, // 197: productv1.ProductService.MutationCreateBlogPost:output_type -> productv1.MutationCreateBlogPostResponse + 83, // 198: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse + 79, // 199: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse + 81, // 200: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse + 93, // 201: productv1.ProductService.MutationUpdateAuthor:output_type -> productv1.MutationUpdateAuthorResponse + 89, // 202: productv1.ProductService.MutationUpdateBlogPost:output_type -> productv1.MutationUpdateBlogPostResponse + 85, // 203: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse + 77, // 204: productv1.ProductService.QueryAllAuthors:output_type -> productv1.QueryAllAuthorsResponse + 69, // 205: productv1.ProductService.QueryAllBlogPosts:output_type -> productv1.QueryAllBlogPostsResponse + 61, // 206: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse + 49, // 207: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse + 71, // 208: productv1.ProductService.QueryAuthor:output_type -> productv1.QueryAuthorResponse + 73, // 209: productv1.ProductService.QueryAuthorById:output_type -> productv1.QueryAuthorByIdResponse + 75, // 210: productv1.ProductService.QueryAuthorsWithFilter:output_type -> productv1.QueryAuthorsWithFilterResponse + 63, // 211: productv1.ProductService.QueryBlogPost:output_type -> productv1.QueryBlogPostResponse + 65, // 212: productv1.ProductService.QueryBlogPostById:output_type -> productv1.QueryBlogPostByIdResponse + 67, // 213: productv1.ProductService.QueryBlogPostsWithFilter:output_type -> productv1.QueryBlogPostsWithFilterResponse + 37, // 214: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse + 39, // 215: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse + 41, // 216: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse + 43, // 217: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse + 35, // 218: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse + 45, // 219: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse + 27, // 220: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse + 55, // 221: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse + 57, // 222: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse + 59, // 223: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse + 47, // 224: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse + 53, // 225: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse + 29, // 226: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse + 51, // 227: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse + 31, // 228: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse + 33, // 229: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse + 25, // 230: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse + 23, // 231: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse + 194, // [194:232] is the sub-list for method output_type + 156, // [156:194] is the sub-list for method input_type + 156, // [156:156] is the sub-list for extension type_name + 156, // [156:156] is the sub-list for extension extendee + 0, // [0:156] is the sub-list for field type_name } func init() { file_product_proto_init() } @@ -7255,16 +8130,16 @@ func file_product_proto_init() { if File_product_proto != nil { return } - file_product_proto_msgTypes[96].OneofWrappers = []any{ + file_product_proto_msgTypes[106].OneofWrappers = []any{ (*Animal_Cat)(nil), (*Animal_Dog)(nil), } - file_product_proto_msgTypes[98].OneofWrappers = []any{ + file_product_proto_msgTypes[108].OneofWrappers = []any{ (*SearchResult_Product)(nil), (*SearchResult_User)(nil), (*SearchResult_Category)(nil), } - file_product_proto_msgTypes[107].OneofWrappers = []any{ + file_product_proto_msgTypes[117].OneofWrappers = []any{ (*ActionResult_ActionSuccess)(nil), (*ActionResult_ActionError)(nil), } @@ -7274,7 +8149,7 @@ func file_product_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_product_proto_rawDesc), len(file_product_proto_rawDesc)), NumEnums: 1, - NumMessages: 123, + NumMessages: 137, NumExtensions: 0, NumServices: 1, }, diff --git a/v2/pkg/grpctest/testdata/products.graphqls b/v2/pkg/grpctest/testdata/products.graphqls index a9244f1040..adde3d8ba4 100644 --- a/v2/pkg/grpctest/testdata/products.graphqls +++ b/v2/pkg/grpctest/testdata/products.graphqls @@ -198,6 +198,16 @@ type BlogPost { relatedTopics: [[String!]]! # Required groups, optional group content, required topics commentThreads: [[String]!]! # Required threads, required thread content, optional comments suggestions: [[String]] # Optional groups, optional group content, optional suggestions + + # Single lists with complex types + relatedCategories: [Category!]! # Required list of categories this post belongs to + contributors: [User!]! # Required list of users who contributed + mentionedProducts: [Product] # Optional list of products mentioned + mentionedUsers: [User] # Optional list of users mentioned + + # Nested lists with complex types + categoryGroups: [[Category!]!]! # Required groups of required categories + contributorTeams: [[User!]] # Optional teams of required contributors } # Author with team structure @@ -214,6 +224,17 @@ type Author { # Nested lists for team organization teamsByProject: [[String!]!]! # Projects -> team members (all required) collaborations: [[String]] # Past collaborations grouped (all optional) + + # Single lists with complex types + writtenPosts: [BlogPost] # Optional list of blog posts they've written + favoriteCategories: [Category!]! # Required list of their favorite categories + relatedAuthors: [User] # Optional list of related authors/collaborators + productReviews: [Product] # Optional list of products they've reviewed + + # Nested lists with complex types + authorGroups: [[User!]] # Optional groups of required authors they work with + categoryPreferences: [[Category!]!]! # Required groups of required category preferences + projectTeams: [[User]] # Optional groups of optional users for projects } # Input types @@ -231,6 +252,11 @@ input BlogPostInput { relatedTopics: [[String!]]! commentThreads: [[String]!]! suggestions: [[String]] + + # Complex type lists with proper input types + relatedCategories: [CategoryInput] # Single list of categories + contributors: [UserInput] # Single list of contributors + categoryGroups: [[CategoryInput!]] # Nested list of category groups } input AuthorInput { @@ -241,6 +267,11 @@ input AuthorInput { socialLinks: [String] teamsByProject: [[String!]!]! collaborations: [[String]] + + # Complex type lists with proper input types + favoriteCategories: [CategoryInput!]! # Single list of favorite categories + authorGroups: [[UserInput!]] # Nested list of author groups + projectTeams: [[UserInput]] # Nested list of project teams (optional) } input BlogPostFilter { From 8e3505b0e1bcab4362d8679973b9201eb4ea3dea Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Tue, 22 Jul 2025 17:04:51 +0200 Subject: [PATCH 04/16] chore: remove comment --- v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go index 352b0dcd8c..4c8a236a3d 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go @@ -184,9 +184,6 @@ func (d *DataSource) marshalResponseJSON(arena *astjson.Arena, message *RPCMessa if fd.IsList() { list := data.Get(fd).List() - // We currently do not yet support to distingish between nullable and non-nullable lists. - // Therefore we always return an empty array for now. - // TODO: Add support for nullable lists. arr := arena.NewArray() root.Set(field.AliasOrPath(), arr) From ccfd2fc03827b921fc26caeeaf04a06e414c4e1e Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Tue, 22 Jul 2025 17:59:53 +0200 Subject: [PATCH 05/16] chore: code cleanup --- .../datasource/grpc_datasource/compiler.go | 89 +++-- .../grpc_datasource/execution_plan.go | 3 +- .../grpc_datasource/grpc_datasource.go | 1 - .../grpc_datasource/grpc_datasource_test.go | 336 +++++++++++++++++- v2/pkg/grpctest/schema.go | 204 +++++++++++ 5 files changed, 591 insertions(+), 42 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index 1ac90fc467..c20abe098f 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -115,10 +115,9 @@ type Method struct { // Message represents a protobuf message type with its fields. type Message struct { - Name string // The name of the message - Fields []Field // The fields in the message - Desc protoref.MessageDescriptor // The protobuf descriptor for the message - NestedMessages []Message // The nested messages in the message + Name string // The name of the message + Fields []Field // The fields in the message + Desc protoref.MessageDescriptor // The protobuf descriptor for the message } // Field represents a field in a protobuf message. @@ -213,14 +212,14 @@ func (d *Document) ServiceByRef(ref int) Service { // MessageByName returns a Message by its name. // Returns an empty Message if no message with the given name exists. -func (d *Document) MessageByName(name string) Message { +func (d *Document) MessageByName(name string) (Message, bool) { for _, m := range d.Messages { if m.Name == name { - return m + return m, true } } - return Message{} + return Message{}, false } // MessageRefByName returns the index of a Message in the Messages slice by its name. @@ -337,13 +336,13 @@ func (p *RPCCompiler) Compile(executionPlan *RPCExecutionPlan, inputData gjson.R invocations := make([]Invocation, 0, len(executionPlan.Calls)) for _, call := range executionPlan.Calls { - inputMessage := p.doc.MessageByName(call.Request.Name) - if inputMessage.Name == "" { + inputMessage, ok := p.doc.MessageByName(call.Request.Name) + if !ok { return nil, fmt.Errorf("input message %s not found in document", call.Request.Name) } - outputMessage := p.doc.MessageByName(call.Response.Name) - if outputMessage.Name == "" { + outputMessage, ok := p.doc.MessageByName(call.Response.Name) + if !ok { return nil, fmt.Errorf("output message %s not found in document", call.Response.Name) } @@ -496,21 +495,11 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes } if field.Type == DataTypeEnum { - enum, ok := p.doc.EnumByName(rpcField.EnumName) - if !ok { - p.report.AddInternalError(fmt.Errorf("enum %s not found in document", rpcField.EnumName)) - continue - } - - for _, enumValue := range enum.Values { - if enumValue.GraphqlValue == data.Get(rpcField.JSONPath).String() { - message.Set( - fd.ByName(protoref.Name(field.Name)), - protoref.ValueOfEnum(protoref.EnumNumber(enumValue.Number)), - ) - - break - } + if val := p.getEnumValue(rpcField.EnumName, data.Get(rpcField.JSONPath)); val != nil { + message.Set( + fd.ByName(protoref.Name(field.Name)), + *val, + ) } continue @@ -536,7 +525,6 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi if level >= rpcField.ListMetadata.NestingLevel { arr := data.Array() - // TODO handle optional lists if len(arr) == 0 { if rpcField.ListMetadata.LevelInfo[level-1].Optional { return nil @@ -554,11 +542,24 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi itemsField := rootMsg.Mutable(fieldDesc).List() - switch { - case rpcField.Message != nil: + switch DataType(rpcField.TypeName) { + case DataTypeMessage: + itemsFieldMsg, ok := p.doc.MessageByName(rpcField.Message.Name) + if !ok { + p.report.AddInternalError(fmt.Errorf("message %s not found in document", rpcField.Message.Name)) + return nil + } + + for _, element := range arr { + if msg := p.buildProtoMessage(itemsFieldMsg, rpcField.Message, element); msg != nil { + itemsField.Append(protoref.ValueOfMessage(msg)) + } + } + case DataTypeEnum: for _, element := range arr { - msg := p.buildProtoMessage(p.doc.Messages[field.MessageRef], rpcField.Message, element) - itemsField.Append(protoref.ValueOfMessage(msg)) + if val := p.getEnumValue(rpcField.EnumName, element); val != nil { + itemsField.Append(*val) + } } default: for _, element := range arr { @@ -598,8 +599,9 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi itemsField := itemsFieldMsg.Mutable(itemsFieldDesc) for _, element := range elements { newElement := itemsField.List().NewElement() - val := p.traverseList(newElement.Message(), level+1, field, rpcField, element) - itemsField.List().Append(protoref.ValueOfMessage(val)) + if val := p.traverseList(newElement.Message(), level+1, field, rpcField, element); val != nil { + itemsField.List().Append(protoref.ValueOfMessage(val)) + } } rootMsg.Set(listFieldDesc, newListField) @@ -607,6 +609,23 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi return rootMsg } +func (p *RPCCompiler) getEnumValue(enumName string, data gjson.Result) *protoref.Value { + enum, ok := p.doc.EnumByName(enumName) + if !ok { + p.report.AddInternalError(fmt.Errorf("enum %s not found in document", enumName)) + return nil + } + + for _, enumValue := range enum.Values { + if enumValue.GraphqlValue == data.String() { + v := protoref.ValueOfEnum(protoref.EnumNumber(enumValue.Number)) + return &v + } + } + + return nil +} + // setValueForKind converts a gjson.Result value to the appropriate protobuf value // based on its kind/type. func (p *RPCCompiler) setValueForKind(kind DataType, data gjson.Result) protoref.Value { @@ -719,10 +738,6 @@ func (p *RPCCompiler) parseMessageDefinitions(messages protoref.MessageDescripto Desc: protoMessage, } - if protoMessage.Messages().Len() > 0 { - message.NestedMessages = p.parseMessageDefinitions(protoMessage.Messages()) - } - extractedMessages = append(extractedMessages, message) } diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go index c0fd5f6042..048f0eefa7 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go @@ -213,7 +213,6 @@ func (r *RPCField) ToOptionalTypeMessage(protoName string) *RPCMessage { }, }, } - } // AliasOrPath returns the alias of the field if it exists, otherwise it returns the JSONPath. @@ -227,7 +226,7 @@ func (r *RPCField) AliasOrPath() string { // IsOptionalScalar checks if the field is an optional scalar value. func (r *RPCField) IsOptionalScalar() bool { - return r.Optional && r.Message == nil + return r.Optional && r.TypeName != string(DataTypeMessage) } // RPCFields is a list of RPCFields that provides helper methods diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go index 4c8a236a3d..09aa044687 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go @@ -225,7 +225,6 @@ func (d *DataSource) marshalResponseJSON(arena *astjson.Arena, message *RPCMessa } root.Set(field.AliasOrPath(), arr) - continue } diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go index 2cfa0b0bf9..87f07299cc 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go @@ -425,13 +425,17 @@ func TestMarshalResponseJSON(t *testing.T) { t.Fatalf("failed to compile proto: %v", err) } - productMessageDesc := compiler.doc.MessageByName("Product").Desc + productMsg, ok := compiler.doc.MessageByName("Product") + require.True(t, ok) + productMessageDesc := productMsg.Desc productMessage := dynamicpb.NewMessage(productMessageDesc) productMessage.Set(productMessageDesc.Fields().ByName("id"), protoref.ValueOfString("123")) productMessage.Set(productMessageDesc.Fields().ByName("name"), protoref.ValueOfString("test")) productMessage.Set(productMessageDesc.Fields().ByName("price"), protoref.ValueOfFloat64(123.45)) - responseMessageDesc := compiler.doc.MessageByName("LookupProductByIdResponse").Desc + responseMsg, ok := compiler.doc.MessageByName("LookupProductByIdResponse") + require.True(t, ok) + responseMessageDesc := responseMsg.Desc responseMessage := dynamicpb.NewMessage(responseMessageDesc) responseMessage.Mutable(responseMessageDesc.Fields().ByName("result")).List().Append(protoref.ValueOfMessage(productMessage)) @@ -2555,6 +2559,334 @@ func Test_DataSource_Load_WithNestedLists(t *testing.T) { } }, }, + { + name: "Should handle BlogPost creation with complex input lists and nested complex input lists", + query: `mutation($input: BlogPostInput!) { + createBlogPost(input: $input) { + id + title + content + tags + optionalTags + categories + keywords + viewCounts + ratings + isPublished + tagGroups + relatedTopics + commentThreads + suggestions + relatedCategories { + id + name + kind + } + contributors { + id + name + } + categoryGroups { + id + name + kind + } + } + }`, + vars: `{"variables":{"input":{"title":"Complex Lists Blog Post","content":"Testing complex input lists","tags":["graphql","grpc","lists"],"optionalTags":["optional1","optional2"],"categories":["Technology","Programming"],"keywords":["nested","complex","types"],"viewCounts":[150,250,350],"ratings":[4.2,4.8,3.9],"isPublished":[true,false,true],"tagGroups":[["graphql","schema"],["grpc","protobuf"],["lists","arrays"]],"relatedTopics":[["backend","api"],["frontend","ui"]],"commentThreads":[["Great post!","Thanks for sharing"],["Very helpful","Keep it up"]],"suggestions":[["Add examples"],["More details","Better formatting"]],"relatedCategories":[{"name":"Web Development","kind":"ELECTRONICS"},{"name":"API Design","kind":"OTHER"}],"contributors":[{"name":"Alice Developer"},{"name":"Bob Engineer"}],"categoryGroups":[[{"name":"Backend","kind":"ELECTRONICS"},{"name":"Database","kind":"OTHER"}],[{"name":"Frontend","kind":"ELECTRONICS"}]]}}}`, + validate: func(t *testing.T, data map[string]interface{}) { + createBlogPost, ok := data["createBlogPost"].(map[string]interface{}) + require.True(t, ok, "createBlogPost should be an object") + + // Check basic fields from input + require.NotEmpty(t, createBlogPost["id"]) + require.Equal(t, "Complex Lists Blog Post", createBlogPost["title"]) + require.Equal(t, "Testing complex input lists", createBlogPost["content"]) + + // Check scalar lists from input + tags, ok := createBlogPost["tags"].([]interface{}) + require.True(t, ok, "tags should be an array") + require.Contains(t, tags, "graphql") + require.Contains(t, tags, "grpc") + require.Contains(t, tags, "lists") + + optionalTags, ok := createBlogPost["optionalTags"].([]interface{}) + require.True(t, ok, "optionalTags should be an array") + require.Contains(t, optionalTags, "optional1") + require.Contains(t, optionalTags, "optional2") + + categories, ok := createBlogPost["categories"].([]interface{}) + require.True(t, ok, "categories should be an array") + require.Contains(t, categories, "Technology") + require.Contains(t, categories, "Programming") + + keywords, ok := createBlogPost["keywords"].([]interface{}) + require.True(t, ok, "keywords should be an array") + require.Contains(t, keywords, "nested") + require.Contains(t, keywords, "complex") + require.Contains(t, keywords, "types") + + // Check nested scalar lists from input + tagGroups, ok := createBlogPost["tagGroups"].([]interface{}) + require.True(t, ok, "tagGroups should be an array") + require.Len(t, tagGroups, 3) + + firstTagGroup, ok := tagGroups[0].([]interface{}) + require.True(t, ok, "first tag group should be an array") + require.Contains(t, firstTagGroup, "graphql") + require.Contains(t, firstTagGroup, "schema") + + relatedTopics, ok := createBlogPost["relatedTopics"].([]interface{}) + require.True(t, ok, "relatedTopics should be an array") + require.Len(t, relatedTopics, 2) + + commentThreads, ok := createBlogPost["commentThreads"].([]interface{}) + require.True(t, ok, "commentThreads should be an array") + require.Len(t, commentThreads, 2) + + suggestions, ok := createBlogPost["suggestions"].([]interface{}) + require.True(t, ok, "suggestions should be an array") + require.Len(t, suggestions, 2) + + // Check single complex lists from input - converted from input types to output types + // relatedCategories: [CategoryInput] -> [Category] + relatedCategories, ok := createBlogPost["relatedCategories"].([]interface{}) + require.True(t, ok, "relatedCategories should be an array") + require.Len(t, relatedCategories, 2) + for i, cat := range relatedCategories { + category, ok := cat.(map[string]interface{}) + require.True(t, ok, "each category should be an object") + require.NotEmpty(t, category["id"]) + require.NotEmpty(t, category["name"]) + require.NotEmpty(t, category["kind"]) + switch i { + case 0: + require.Equal(t, "Web Development", category["name"]) + require.Equal(t, "ELECTRONICS", category["kind"]) + case 1: + require.Equal(t, "API Design", category["name"]) + require.Equal(t, "OTHER", category["kind"]) + } + } + + // contributors: [UserInput] -> [User] + contributors, ok := createBlogPost["contributors"].([]interface{}) + require.True(t, ok, "contributors should be an array") + require.Len(t, contributors, 2) + for i, cont := range contributors { + contributor, ok := cont.(map[string]interface{}) + require.True(t, ok, "each contributor should be an object") + require.NotEmpty(t, contributor["id"]) + require.NotEmpty(t, contributor["name"]) + switch i { + case 0: + require.Equal(t, "Alice Developer", contributor["name"]) + case 1: + require.Equal(t, "Bob Engineer", contributor["name"]) + } + } + + // Check nested complex lists from input - converted from input types to output types + // categoryGroups: [[CategoryInput!]] -> [[Category!]] + categoryGroups, ok := createBlogPost["categoryGroups"].([]interface{}) + require.True(t, ok, "categoryGroups should be an array") + require.Len(t, categoryGroups, 2) + + // First group should have 2 categories + firstCategoryGroup, ok := categoryGroups[0].([]interface{}) + require.True(t, ok, "first category group should be an array") + require.Len(t, firstCategoryGroup, 2) + for i, cat := range firstCategoryGroup { + category, ok := cat.(map[string]interface{}) + require.True(t, ok, "each category should be an object") + require.NotEmpty(t, category["id"]) + require.NotEmpty(t, category["name"]) + require.NotEmpty(t, category["kind"]) + switch i { + case 0: + require.Equal(t, "Backend", category["name"]) + require.Equal(t, "ELECTRONICS", category["kind"]) + case 1: + require.Equal(t, "Database", category["name"]) + require.Equal(t, "OTHER", category["kind"]) + } + } + + // Second group should have 1 category + secondCategoryGroup, ok := categoryGroups[1].([]interface{}) + require.True(t, ok, "second category group should be an array") + require.Len(t, secondCategoryGroup, 1) + category, ok := secondCategoryGroup[0].(map[string]interface{}) + require.True(t, ok, "category should be an object") + require.NotEmpty(t, category["id"]) + require.Equal(t, "Frontend", category["name"]) + require.Equal(t, "ELECTRONICS", category["kind"]) + }, + }, + { + name: "Should handle Author with complex lists and nested complex lists", + query: `query { + author { + id + name + email + writtenPosts { + id + title + content + } + favoriteCategories { + id + name + kind + } + relatedAuthors { + id + name + } + productReviews { + id + name + price + } + authorGroups { + id + name + } + categoryPreferences { + id + name + kind + } + projectTeams { + id + name + } + } + }`, + vars: "{}", + validate: func(t *testing.T, data map[string]interface{}) { + author, ok := data["author"].(map[string]interface{}) + require.True(t, ok, "author should be an object") + + // Check basic fields + require.NotEmpty(t, author["id"]) + require.NotEmpty(t, author["name"]) + + // Check single complex lists + // writtenPosts: [BlogPost] - Optional list of blog posts + if writtenPosts := author["writtenPosts"]; writtenPosts != nil { + writtenPostsArr, ok := writtenPosts.([]interface{}) + require.True(t, ok, "writtenPosts should be an array if present") + for _, post := range writtenPostsArr { + if post != nil { // posts can be null + blogPost, ok := post.(map[string]interface{}) + require.True(t, ok, "each blog post should be an object") + require.NotEmpty(t, blogPost["id"]) + require.NotEmpty(t, blogPost["title"]) + require.NotEmpty(t, blogPost["content"]) + } + } + } + + // favoriteCategories: [Category!]! - Required list of required categories + favoriteCategories, ok := author["favoriteCategories"].([]interface{}) + require.True(t, ok, "favoriteCategories should be an array") + require.NotEmpty(t, favoriteCategories, "favoriteCategories should not be empty") + for _, cat := range favoriteCategories { + category, ok := cat.(map[string]interface{}) + require.True(t, ok, "each category should be an object") + require.NotEmpty(t, category["id"]) + require.NotEmpty(t, category["name"]) + require.NotEmpty(t, category["kind"]) + } + + // relatedAuthors: [User] - Optional list of related authors/collaborators + if relatedAuthors := author["relatedAuthors"]; relatedAuthors != nil { + relatedAuthorsArr, ok := relatedAuthors.([]interface{}) + require.True(t, ok, "relatedAuthors should be an array if present") + for _, auth := range relatedAuthorsArr { + if auth != nil { // authors can be null + authorObj, ok := auth.(map[string]interface{}) + require.True(t, ok, "each author should be an object") + require.NotEmpty(t, authorObj["id"]) + require.NotEmpty(t, authorObj["name"]) + } + } + } + + // productReviews: [Product] - Optional list of products they've reviewed + if productReviews := author["productReviews"]; productReviews != nil { + productReviewsArr, ok := productReviews.([]interface{}) + require.True(t, ok, "productReviews should be an array if present") + for _, prod := range productReviewsArr { + if prod != nil { // products can be null + product, ok := prod.(map[string]interface{}) + require.True(t, ok, "each product should be an object") + require.NotEmpty(t, product["id"]) + require.NotEmpty(t, product["name"]) + require.NotEmpty(t, product["price"]) + } + } + } + + // Nested complex lists + // authorGroups: [[User!]] - Optional groups of required authors + if authorGroups := author["authorGroups"]; authorGroups != nil { + authorGroupsArr, ok := authorGroups.([]interface{}) + require.True(t, ok, "authorGroups should be an array if present") + for _, group := range authorGroupsArr { + if group != nil { // groups can be null + groupArr, ok := group.([]interface{}) + require.True(t, ok, "authorGroups items should be arrays") + for _, auth := range groupArr { + authorObj, ok := auth.(map[string]interface{}) + require.True(t, ok, "each author should be an object") + require.NotEmpty(t, authorObj["id"]) + require.NotEmpty(t, authorObj["name"]) + } + } + } + } + + // categoryPreferences: [[Category!]!]! - Required groups of required category preferences + categoryPreferences, ok := author["categoryPreferences"].([]interface{}) + require.True(t, ok, "categoryPreferences should be an array") + require.NotEmpty(t, categoryPreferences, "categoryPreferences should not be empty") + for _, group := range categoryPreferences { + groupArr, ok := group.([]interface{}) + require.True(t, ok, "categoryPreferences items should be arrays") + require.NotEmpty(t, groupArr, "categoryPreferences inner arrays should not be empty") + for _, cat := range groupArr { + category, ok := cat.(map[string]interface{}) + require.True(t, ok, "each category should be an object") + require.NotEmpty(t, category["id"]) + require.NotEmpty(t, category["name"]) + require.NotEmpty(t, category["kind"]) + } + } + + // projectTeams: [[User]] - Optional groups of optional users for projects + if projectTeams := author["projectTeams"]; projectTeams != nil { + projectTeamsArr, ok := projectTeams.([]interface{}) + require.True(t, ok, "projectTeams should be an array if present") + for _, team := range projectTeamsArr { + if team != nil { // teams can be null + teamArr, ok := team.([]interface{}) + require.True(t, ok, "projectTeams items should be arrays") + for _, user := range teamArr { + if user != nil { // users can be null + userObj, ok := user.(map[string]interface{}) + require.True(t, ok, "each user should be an object") + require.NotEmpty(t, userObj["id"]) + require.NotEmpty(t, userObj["name"]) + } + } + } + } + } + }, + }, } for _, tc := range testCases { diff --git a/v2/pkg/grpctest/schema.go b/v2/pkg/grpctest/schema.go index fc0248b645..e0516bd974 100644 --- a/v2/pkg/grpctest/schema.go +++ b/v2/pkg/grpctest/schema.go @@ -260,6 +260,94 @@ func GetFieldConfigurations() plan.FieldConfigurations { }, }, }, + { + TypeName: "Query", + FieldName: "blogPostById", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "id", + SourceType: plan.FieldArgumentSource, + }, + }, + }, + { + TypeName: "Query", + FieldName: "blogPostsWithFilter", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "filter", + SourceType: plan.FieldArgumentSource, + }, + }, + }, + { + TypeName: "Query", + FieldName: "authorById", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "id", + SourceType: plan.FieldArgumentSource, + }, + }, + }, + { + TypeName: "Query", + FieldName: "authorsWithFilter", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "filter", + SourceType: plan.FieldArgumentSource, + }, + }, + }, + { + TypeName: "Mutation", + FieldName: "createBlogPost", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "input", + SourceType: plan.FieldArgumentSource, + }, + }, + }, + { + TypeName: "Mutation", + FieldName: "updateBlogPost", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "id", + SourceType: plan.FieldArgumentSource, + }, + { + Name: "input", + SourceType: plan.FieldArgumentSource, + }, + }, + }, + { + TypeName: "Mutation", + FieldName: "createAuthor", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "input", + SourceType: plan.FieldArgumentSource, + }, + }, + }, + { + TypeName: "Mutation", + FieldName: "updateAuthor", + Arguments: []plan.ArgumentConfiguration{ + { + Name: "id", + SourceType: plan.FieldArgumentSource, + }, + { + Name: "input", + SourceType: plan.FieldArgumentSource, + }, + }, + }, } } @@ -305,6 +393,14 @@ func GetDataSourceMetadata() *plan.DataSourceMetadata { "nullableFieldsTypeById", "nullableFieldsTypeWithFilter", "allNullableFieldsTypes", + "blogPost", + "blogPostById", + "blogPostsWithFilter", + "allBlogPosts", + "author", + "authorById", + "authorsWithFilter", + "allAuthors", }, }, { @@ -314,6 +410,10 @@ func GetDataSourceMetadata() *plan.DataSourceMetadata { "performAction", "createNullableFieldsType", "updateNullableFieldsType", + "createBlogPost", + "updateBlogPost", + "createAuthor", + "updateAuthor", }, }, }, @@ -581,6 +681,110 @@ func GetDataSourceMetadata() *plan.DataSourceMetadata { "includeNulls", }, }, + { + TypeName: "BlogPost", + FieldNames: []string{ + "id", + "title", + "content", + "tags", + "optionalTags", + "categories", + "keywords", + "viewCounts", + "ratings", + "isPublished", + "tagGroups", + "relatedTopics", + "commentThreads", + "suggestions", + "relatedCategories", + "contributors", + "mentionedProducts", + "mentionedUsers", + "categoryGroups", + "contributorTeams", + }, + }, + { + TypeName: "Author", + FieldNames: []string{ + "id", + "name", + "email", + "skills", + "languages", + "socialLinks", + "teamsByProject", + "collaborations", + "writtenPosts", + "favoriteCategories", + "relatedAuthors", + "productReviews", + "authorGroups", + "categoryPreferences", + "projectTeams", + }, + }, + { + TypeName: "BlogPostInput", + FieldNames: []string{ + "title", + "content", + "tags", + "optionalTags", + "categories", + "keywords", + "viewCounts", + "ratings", + "isPublished", + "tagGroups", + "relatedTopics", + "commentThreads", + "suggestions", + "relatedCategories", + "contributors", + "categoryGroups", + }, + }, + { + TypeName: "AuthorInput", + FieldNames: []string{ + "name", + "email", + "skills", + "languages", + "socialLinks", + "teamsByProject", + "collaborations", + "favoriteCategories", + "authorGroups", + "projectTeams", + }, + }, + { + TypeName: "BlogPostFilter", + FieldNames: []string{ + "title", + "hasCategories", + "minTags", + }, + }, + { + TypeName: "AuthorFilter", + FieldNames: []string{ + "name", + "hasTeams", + "skillCount", + }, + }, + { + TypeName: "CategoryInput", + FieldNames: []string{ + "name", + "kind", + }, + }, }, } } From 3f95e82ac67a9fc6cbc0c048ef70fb85aaad9346 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Tue, 22 Jul 2025 18:30:07 +0200 Subject: [PATCH 06/16] chore: adds execution tests --- .../engine/execution_engine_grpc_test.go | 634 +++++++++++++++++- .../datasource/grpc_datasource/compiler.go | 9 +- .../grpc_datasource/execution_plan.go | 3 - 3 files changed, 636 insertions(+), 10 deletions(-) diff --git a/execution/engine/execution_engine_grpc_test.go b/execution/engine/execution_engine_grpc_test.go index 0799edaaf6..37cbd0f5c9 100644 --- a/execution/engine/execution_engine_grpc_test.go +++ b/execution/engine/execution_engine_grpc_test.go @@ -534,7 +534,7 @@ func TestGRPCSubgraphExecution(t *testing.T) { response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) require.NoError(t, err) - require.Equal(t, `{"data":{"nullableFieldsTypeById":{"id":"full-data","name":"Full Data by ID","optionalString":"All fields populated","optionalInt":123,"optionalFloat":12.34000015258789,"optionalBoolean":false,"requiredString":"Required by ID","requiredInt":456}}}`, response) + require.Equal(t, `{"data":{"nullableFieldsTypeById":{"id":"full-data","name":"Full Data by ID","optionalString":"All fields populated","optionalInt":123,"optionalFloat":12.34,"optionalBoolean":false,"requiredString":"Required by ID","requiredInt":456}}}`, response) }) t.Run("should handle nullable fields query by ID with partial data", func(t *testing.T) { @@ -631,7 +631,7 @@ func TestGRPCSubgraphExecution(t *testing.T) { response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) require.NoError(t, err) - require.Equal(t, `{"data":{"allNullableFieldsTypes":[{"id":"nullable-1","name":"Full Data Entry","optionalString":"Optional String Value","optionalInt":42,"optionalFloat":3.140000104904175,"optionalBoolean":true,"requiredString":"Required String 1","requiredInt":100},{"id":"nullable-2","name":"Partial Data Entry","optionalString":"Only string is set","optionalInt":null,"optionalFloat":null,"optionalBoolean":false,"requiredString":"Required String 2","requiredInt":200},{"id":"nullable-3","name":"Minimal Data Entry","optionalString":null,"optionalInt":null,"optionalFloat":null,"optionalBoolean":null,"requiredString":"Required String 3","requiredInt":300}]}}`, response) + require.Equal(t, `{"data":{"allNullableFieldsTypes":[{"id":"nullable-1","name":"Full Data Entry","optionalString":"Optional String Value","optionalInt":42,"optionalFloat":3.14,"optionalBoolean":true,"requiredString":"Required String 1","requiredInt":100},{"id":"nullable-2","name":"Partial Data Entry","optionalString":"Only string is set","optionalInt":null,"optionalFloat":null,"optionalBoolean":false,"requiredString":"Required String 2","requiredInt":200},{"id":"nullable-3","name":"Minimal Data Entry","optionalString":null,"optionalInt":null,"optionalFloat":null,"optionalBoolean":null,"requiredString":"Required String 3","requiredInt":300}]}}`, response) }) t.Run("should handle nullable fields query with filter", func(t *testing.T) { @@ -809,4 +809,634 @@ func TestGRPCSubgraphExecution(t *testing.T) { require.NoError(t, err) require.Equal(t, `{"data":{"updateNullableFieldsType":null}}`, response) }) + + // BlogPost and Author list tests + t.Run("should handle BlogPost query with scalar lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "BlogPostScalarListsQuery", + Query: `query BlogPostScalarListsQuery { + blogPost { + id + title + content + tags + optionalTags + categories + keywords + viewCounts + ratings + isPublished + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"tags":`) + require.Contains(t, response, `"optionalTags":`) + require.Contains(t, response, `"categories":`) + require.Contains(t, response, `"keywords":`) + require.Contains(t, response, `"viewCounts":`) + require.Contains(t, response, `"ratings":`) + require.Contains(t, response, `"isPublished":`) + }) + + t.Run("should handle BlogPost query with nested scalar lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "BlogPostNestedScalarListsQuery", + Query: `query BlogPostNestedScalarListsQuery { + blogPost { + id + title + tagGroups + relatedTopics + commentThreads + suggestions + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"tagGroups":`) + require.Contains(t, response, `"relatedTopics":`) + require.Contains(t, response, `"commentThreads":`) + require.Contains(t, response, `"suggestions":`) + // Verify nested structure with arrays of arrays + require.Contains(t, response, `[[`) + }) + + t.Run("should handle BlogPost query with complex lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "BlogPostComplexListsQuery", + Query: `query BlogPostComplexListsQuery { + blogPost { + id + title + relatedCategories { + id + name + kind + } + contributors { + id + name + } + mentionedProducts { + id + name + price + } + mentionedUsers { + id + name + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"relatedCategories":`) + require.Contains(t, response, `"contributors":`) + require.Contains(t, response, `"mentionedProducts":`) + require.Contains(t, response, `"mentionedUsers":`) + // Verify complex objects within lists + require.Contains(t, response, `"kind":`) + require.Contains(t, response, `"price":`) + }) + + t.Run("should handle BlogPost query with nested complex lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "BlogPostNestedComplexListsQuery", + Query: `query BlogPostNestedComplexListsQuery { + blogPost { + id + title + categoryGroups { + id + name + kind + } + contributorTeams { + id + name + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"categoryGroups":`) + require.Contains(t, response, `"contributorTeams":`) + // Verify nested complex objects + require.Contains(t, response, `"kind":`) + }) + + t.Run("should handle BlogPost query by ID", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "BlogPostByIdQuery", + Variables: stringify(map[string]any{ + "id": "test-blog-1", + }), + Query: `query BlogPostByIdQuery($id: ID!) { + blogPostById(id: $id) { + id + title + content + tags + tagGroups + relatedCategories { + id + name + kind + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"id":"test-blog-1"`) + require.Contains(t, response, `"title":"Blog Post test-blog-1"`) + require.Contains(t, response, `"tags":`) + require.Contains(t, response, `"tagGroups":`) + require.Contains(t, response, `"relatedCategories":`) + }) + + t.Run("should handle BlogPost filtered query", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "BlogPostFilteredQuery", + Variables: stringify(map[string]any{ + "filter": map[string]any{ + "title": "Test", + "hasCategories": true, + "minTags": 2, + }, + }), + Query: `query BlogPostFilteredQuery($filter: BlogPostFilter!) { + blogPostsWithFilter(filter: $filter) { + id + title + tags + categories + tagGroups + relatedCategories { + id + name + kind + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"blogPostsWithFilter":`) + require.Contains(t, response, `"tags":`) + require.Contains(t, response, `"categories":`) + require.Contains(t, response, `"tagGroups":`) + require.Contains(t, response, `"relatedCategories":`) + }) + + t.Run("should handle Author query with scalar lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AuthorScalarListsQuery", + Query: `query AuthorScalarListsQuery { + author { + id + name + email + skills + languages + socialLinks + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"skills":`) + require.Contains(t, response, `"languages":`) + require.Contains(t, response, `"socialLinks":`) + }) + + t.Run("should handle Author query with nested scalar lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AuthorNestedScalarListsQuery", + Query: `query AuthorNestedScalarListsQuery { + author { + id + name + teamsByProject + collaborations + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"teamsByProject":`) + require.Contains(t, response, `"collaborations":`) + // Verify nested structure + require.Contains(t, response, `[[`) + }) + + t.Run("should handle Author query with complex lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AuthorComplexListsQuery", + Query: `query AuthorComplexListsQuery { + author { + id + name + writtenPosts { + id + title + content + } + favoriteCategories { + id + name + kind + } + relatedAuthors { + id + name + } + productReviews { + id + name + price + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"writtenPosts":`) + require.Contains(t, response, `"favoriteCategories":`) + require.Contains(t, response, `"relatedAuthors":`) + require.Contains(t, response, `"productReviews":`) + // Verify complex objects within lists + require.Contains(t, response, `"title":`) + require.Contains(t, response, `"kind":`) + require.Contains(t, response, `"price":`) + }) + + t.Run("should handle Author query with nested complex lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AuthorNestedComplexListsQuery", + Query: `query AuthorNestedComplexListsQuery { + author { + id + name + authorGroups { + id + name + } + categoryPreferences { + id + name + kind + } + projectTeams { + id + name + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"authorGroups":`) + require.Contains(t, response, `"categoryPreferences":`) + require.Contains(t, response, `"projectTeams":`) + // Verify nested complex objects + require.Contains(t, response, `"kind":`) + }) + + t.Run("should handle Author query by ID", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AuthorByIdQuery", + Variables: stringify(map[string]any{ + "id": "test-author-1", + }), + Query: `query AuthorByIdQuery($id: ID!) { + authorById(id: $id) { + id + name + skills + teamsByProject + favoriteCategories { + id + name + kind + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"id":"test-author-1"`) + require.Contains(t, response, `"name":"Author test-author-1"`) + require.Contains(t, response, `"skills":`) + require.Contains(t, response, `"teamsByProject":`) + require.Contains(t, response, `"favoriteCategories":`) + }) + + t.Run("should handle Author filtered query", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AuthorFilteredQuery", + Variables: stringify(map[string]any{ + "filter": map[string]any{ + "name": "Test", + "hasTeams": true, + "skillCount": 3, + }, + }), + Query: `query AuthorFilteredQuery($filter: AuthorFilter!) { + authorsWithFilter(filter: $filter) { + id + name + skills + teamsByProject + favoriteCategories { + id + name + kind + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"authorsWithFilter":`) + require.Contains(t, response, `"skills":`) + require.Contains(t, response, `"teamsByProject":`) + require.Contains(t, response, `"favoriteCategories":`) + }) + + t.Run("should handle BlogPost creation mutation with complex input lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "CreateBlogPostMutation", + Variables: stringify(map[string]any{ + "input": map[string]any{ + "title": "Complex Lists Blog Post", + "content": "Testing complex input lists", + "tags": []string{"graphql", "grpc", "lists"}, + "optionalTags": []string{"optional1", "optional2"}, + "categories": []string{"Technology", "Programming"}, + "keywords": []string{"nested", "complex", "types"}, + "viewCounts": []int{150, 250, 350}, + "ratings": []float64{4.2, 4.8, 3.9}, + "isPublished": []bool{true, false, true}, + "tagGroups": [][]string{ + {"graphql", "schema"}, + {"grpc", "protobuf"}, + {"lists", "arrays"}, + }, + "relatedTopics": [][]string{ + {"backend", "api"}, + {"frontend", "ui"}, + }, + "commentThreads": [][]string{ + {"Great post!", "Thanks for sharing"}, + {"Very helpful", "Keep it up"}, + }, + "suggestions": [][]string{ + {"Add examples"}, + {"More details", "Better formatting"}, + }, + "relatedCategories": []map[string]any{ + {"name": "Web Development", "kind": "ELECTRONICS"}, + {"name": "API Design", "kind": "OTHER"}, + }, + "contributors": []map[string]any{ + {"name": "Alice Developer"}, + {"name": "Bob Engineer"}, + }, + "categoryGroups": [][]map[string]any{ + { + {"name": "Backend", "kind": "ELECTRONICS"}, + {"name": "Database", "kind": "OTHER"}, + }, + { + {"name": "Frontend", "kind": "ELECTRONICS"}, + }, + }, + }, + }), + Query: `mutation CreateBlogPostMutation($input: BlogPostInput!) { + createBlogPost(input: $input) { + id + title + content + tags + optionalTags + categories + keywords + viewCounts + ratings + isPublished + tagGroups + relatedTopics + commentThreads + suggestions + relatedCategories { + id + name + kind + } + contributors { + id + name + } + categoryGroups { + id + name + kind + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"title":"Complex Lists Blog Post"`) + require.Contains(t, response, `"content":"Testing complex input lists"`) + require.Contains(t, response, `"tags":["graphql","grpc","lists"]`) + require.Contains(t, response, `"optionalTags":["optional1","optional2"]`) + require.Contains(t, response, `"categories":["Technology","Programming"]`) + require.Contains(t, response, `"keywords":["nested","complex","types"]`) + require.Contains(t, response, `"viewCounts":[150,250,350]`) + require.Contains(t, response, `"ratings":[4.2,4.8,3.9]`) + require.Contains(t, response, `"isPublished":[true,false,true]`) + require.Contains(t, response, `"tagGroups":[["graphql","schema"],["grpc","protobuf"],["lists","arrays"]]`) + require.Contains(t, response, `"relatedTopics":[["backend","api"],["frontend","ui"]]`) + require.Contains(t, response, `"relatedCategories":`) + require.Contains(t, response, `"contributors":`) + require.Contains(t, response, `"categoryGroups":`) + require.Contains(t, response, `"name":"Web Development"`) + require.Contains(t, response, `"name":"Alice Developer"`) + require.Contains(t, response, `"name":"Backend"`) + }) + + t.Run("should handle Author creation mutation with complex input lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "CreateAuthorMutation", + Variables: stringify(map[string]any{ + "input": map[string]any{ + "name": "New Author", + "email": "author@example.com", + "skills": []string{"Go", "GraphQL", "gRPC"}, + "languages": []string{"English", "Spanish"}, + "socialLinks": []string{"twitter.com/author", "github.com/author"}, + "teamsByProject": [][]string{ + {"Alice", "Bob"}, + {"Charlie", "David", "Eve"}, + }, + "collaborations": [][]string{ + {"Project1", "Project2"}, + {"Project3"}, + }, + "favoriteCategories": []map[string]any{ + {"name": "Backend Development", "kind": "ELECTRONICS"}, + {"name": "API Design", "kind": "OTHER"}, + }, + "authorGroups": [][]map[string]any{ + { + {"name": "Go Team"}, + {"name": "GraphQL Team"}, + }, + }, + "projectTeams": [][]map[string]any{ + { + {"name": "Team Lead"}, + {"name": "Senior Dev"}, + }, + { + {"name": "Junior Dev"}, + }, + }, + }, + }), + Query: `mutation CreateAuthorMutation($input: AuthorInput!) { + createAuthor(input: $input) { + id + name + email + skills + languages + socialLinks + teamsByProject + collaborations + favoriteCategories { + id + name + kind + } + authorGroups { + id + name + } + projectTeams { + id + name + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"name":"New Author"`) + require.Contains(t, response, `"email":"author@example.com"`) + require.Contains(t, response, `"skills":["Go","GraphQL","gRPC"]`) + require.Contains(t, response, `"languages":["English","Spanish"]`) + require.Contains(t, response, `"socialLinks":["twitter.com/author","github.com/author"]`) + require.Contains(t, response, `"teamsByProject":[["Alice","Bob"],["Charlie","David","Eve"]]`) + require.Contains(t, response, `"collaborations":[["Project1","Project2"],["Project3"]]`) + require.Contains(t, response, `"favoriteCategories":`) + require.Contains(t, response, `"authorGroups":`) + require.Contains(t, response, `"projectTeams":`) + require.Contains(t, response, `"name":"Backend Development"`) + require.Contains(t, response, `"name":"Go Team"`) + }) + + t.Run("should handle all BlogPosts query with lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AllBlogPostsQuery", + Query: `query AllBlogPostsQuery { + allBlogPosts { + id + title + tags + tagGroups + viewCounts + ratings + relatedCategories { + id + name + kind + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"allBlogPosts":`) + require.Contains(t, response, `"tags":`) + require.Contains(t, response, `"tagGroups":`) + require.Contains(t, response, `"viewCounts":`) + require.Contains(t, response, `"ratings":`) + require.Contains(t, response, `"relatedCategories":`) + }) + + t.Run("should handle all Authors query with lists", func(t *testing.T) { + operation := graphql.Request{ + OperationName: "AllAuthorsQuery", + Query: `query AllAuthorsQuery { + allAuthors { + id + name + skills + teamsByProject + favoriteCategories { + id + name + kind + } + } + }`, + } + + response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) + + require.NoError(t, err) + require.Contains(t, response, `"allAuthors":`) + require.Contains(t, response, `"skills":`) + require.Contains(t, response, `"teamsByProject":`) + require.Contains(t, response, `"favoriteCategories":`) + }) } diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index c20abe098f..da0633b858 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -521,8 +521,6 @@ func (p *RPCCompiler) buildListMessage(desc protoref.MessageDescriptor, field Fi } func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Field, rpcField *RPCField, data gjson.Result) protoref.Message { - fd := rootMsg.Descriptor() - if level >= rpcField.ListMetadata.NestingLevel { arr := data.Array() if len(arr) == 0 { @@ -534,7 +532,7 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi } // List wrappers always use field number 1 - fieldDesc := fd.Fields().ByNumber(1) + fieldDesc := rootMsg.Descriptor().Fields().ByNumber(1) if fieldDesc == nil { p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, rootMsg.Descriptor().Name())) return nil @@ -571,8 +569,8 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi return rootMsg } - // We always expect a list fields in the root message. - listFieldDesc := fd.Fields().ByNumber(1) + // For nested Lists we always expect a "list" field in the root message with field number 1 + listFieldDesc := rootMsg.Descriptor().Fields().ByNumber(1) if listFieldDesc == nil { p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, rootMsg.Descriptor().Name())) return nil @@ -589,6 +587,7 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi return rootMsg } + // Inside of a List message type we expect a repeated "items" field with field number 1 itemsFieldMsg := newListField.Message() itemsFieldDesc := itemsFieldMsg.Descriptor().Fields().ByNumber(1) if itemsFieldDesc == nil { diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go index 048f0eefa7..ad41e4baf8 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan.go @@ -14,9 +14,6 @@ const ( // knownTypeOptionalFieldValueName is the name of the field that is used to wrap optional scalar values // in a message as protobuf scalar types are not nullable. knownTypeOptionalFieldValueName = "value" - - // knownListWrapperPrefix is the prefix of the known list wrapper types. - knownListWrapperPrefix = "ListOf" ) // OneOfType represents the type of a oneof field in a protobuf message. From 8f7a9d979016cbef232a446c60b81e2537cfe5c9 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Tue, 22 Jul 2025 18:34:18 +0200 Subject: [PATCH 07/16] chore: remove comment --- .../datasource/grpc_datasource/grpc_datasource.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go index 09aa044687..e0d6ef6af2 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go @@ -260,18 +260,6 @@ func (d *DataSource) marshalResponseJSON(arena *astjson.Arena, message *RPCMessa return root, nil } -/* - message ListOfListOfString { - message List { - repeated ListOfString items = 1; - } - List list = 1; - } - - message ListOfString { - repeated string items = 1; - } -*/ func (d *DataSource) flattenListStructure(arena *astjson.Arena, md *ListMetadata, data protoref.Message, message *RPCMessage) (*astjson.Value, error) { if md == nil { return arena.NewNull(), fmt.Errorf("unable to flatten list structure: list metadata not found") From 0f18be21bc12a749a942c45f0b83ba95db2ede01 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Tue, 22 Jul 2025 18:37:04 +0200 Subject: [PATCH 08/16] chore: improvement --- .../engine/datasource/grpc_datasource/compiler.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index da0633b858..3376d1d4f1 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -449,17 +449,12 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes case rpcField.IsListType: // nested and nullable lists are wrapped in a message, therefore we need to handle them differently // than repeated fields. - - // if !data.Get(rpcField.JSONPath).Exists() { - // if rpcField.Optional { - // continue - // } - // } - - if rpcField.Optional { - if !data.Get(rpcField.JSONPath).Exists() { - continue + if !data.Get(rpcField.JSONPath).Exists() { + if !rpcField.Optional { + p.report.AddInternalError(fmt.Errorf("field %s is required but has no value", rpcField.JSONPath)) } + + continue } if rpcField.ListMetadata == nil { From 26ed90c601633a6782f516de5e3d82a6a9fb13e1 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Wed, 23 Jul 2025 16:18:17 +0200 Subject: [PATCH 09/16] chore: improve handling of non nullable lists --- .../datasource/grpc_datasource/compiler.go | 1 - .../grpc_datasource/grpc_datasource.go | 16 ++++++++++++++++ v2/pkg/grpctest/Makefile | 6 +++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index 3376d1d4f1..9f727da930 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -501,7 +501,6 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes } // Handle scalar fields - // TODO handle optional fields value := data.Get(rpcField.JSONPath) message.Set(fd.ByName(protoref.Name(field.Name)), p.setValueForKind(field.Type, value)) } diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go index e0d6ef6af2..fb50db0ce7 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go @@ -265,6 +265,14 @@ func (d *DataSource) flattenListStructure(arena *astjson.Arena, md *ListMetadata return arena.NewNull(), fmt.Errorf("unable to flatten list structure: list metadata not found") } + if !data.IsValid() { + if md.LevelInfo[0].Optional { + return arena.NewNull(), nil + } + + return arena.NewNull(), fmt.Errorf("cannot add null item to response for non nullable list") + } + root := arena.NewArray() return d.traverseList(0, arena, root, md, data, message) } @@ -314,6 +322,14 @@ func (d *DataSource) traverseList(level int, arena *astjson.Arena, current *astj } list := data.Get(fd).List() + if !list.IsValid() { + if md.LevelInfo[level].Optional { + return arena.NewNull(), nil + } + + return arena.NewNull(), fmt.Errorf("cannot add null item to response for non nullable list") + } + for i := 0; i < list.Len(); i++ { if message != nil { val, err := d.marshalResponseJSON(arena, message, list.Get(i).Message()) diff --git a/v2/pkg/grpctest/Makefile b/v2/pkg/grpctest/Makefile index 0c27bf834a..847d67b725 100644 --- a/v2/pkg/grpctest/Makefile +++ b/v2/pkg/grpctest/Makefile @@ -3,16 +3,16 @@ install-protoc: go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest -PHONY: generate-proto +.PHONY: generate-proto generate-proto: install-protoc protoc --go_out=productv1 --go_opt=paths=source_relative \ --go-grpc_out=productv1 --go-grpc_opt=paths=source_relative \ product.proto -PHONY: build-plugin +.PHONY: build-plugin build-plugin: go build -o plugin/plugin_service plugin/plugin_service.go -PHONY: regenerate-proto +.PHONY: regenerate-proto regenerate-proto: pnpx wgc@latest grpc-service generate -i testdata/products.graphqls -o testdata/ -p productv1 -g "cosmo/pkg/proto/productv1;productv1" Product From cda6229ba57b7d8cfb260c537a686aa27ce38e88 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 28 Jul 2025 09:07:32 +0200 Subject: [PATCH 10/16] chore: improve list handling --- .../datasource/grpc_datasource/compiler.go | 78 +- .../grpc_datasource/compiler_test.go | 4 +- .../grpc_datasource/grpc_datasource.go | 41 +- v2/pkg/grpctest/mockservice.go | 450 ++++--- v2/pkg/grpctest/product.proto | 65 +- v2/pkg/grpctest/productv1/product.pb.go | 1098 ++++++++++++----- 6 files changed, 1187 insertions(+), 549 deletions(-) diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index 9f727da930..c378355b81 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -515,25 +515,34 @@ func (p *RPCCompiler) buildListMessage(desc protoref.MessageDescriptor, field Fi } func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Field, rpcField *RPCField, data gjson.Result) protoref.Message { - if level >= rpcField.ListMetadata.NestingLevel { - arr := data.Array() - if len(arr) == 0 { - if rpcField.ListMetadata.LevelInfo[level-1].Optional { - return nil - } - - return rootMsg - } + listFieldDesc := rootMsg.Descriptor().Fields().ByNumber(1) + if listFieldDesc == nil { + p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, rootMsg.Descriptor().Name())) + return nil + } - // List wrappers always use field number 1 - fieldDesc := rootMsg.Descriptor().Fields().ByNumber(1) - if fieldDesc == nil { - p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, rootMsg.Descriptor().Name())) + elements := data.Array() + newListField := rootMsg.NewField(listFieldDesc) + if len(elements) == 0 { + if rpcField.ListMetadata.LevelInfo[level-1].Optional { return nil } - itemsField := rootMsg.Mutable(fieldDesc).List() + rootMsg.Set(listFieldDesc, newListField) + return rootMsg + } + + // Inside of a List message type we expect a repeated "items" field with field number 1 + itemsFieldMsg := newListField.Message() + itemsFieldDesc := itemsFieldMsg.Descriptor().Fields().ByNumber(1) + if itemsFieldDesc == nil { + p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, itemsFieldMsg.Descriptor().Name())) + return nil + } + itemsField := itemsFieldMsg.Mutable(itemsFieldDesc).List() + + if level >= rpcField.ListMetadata.NestingLevel { switch DataType(rpcField.TypeName) { case DataTypeMessage: itemsFieldMsg, ok := p.doc.MessageByName(rpcField.Message.Name) @@ -542,63 +551,36 @@ func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Fi return nil } - for _, element := range arr { + for _, element := range elements { if msg := p.buildProtoMessage(itemsFieldMsg, rpcField.Message, element); msg != nil { itemsField.Append(protoref.ValueOfMessage(msg)) } } case DataTypeEnum: - for _, element := range arr { + for _, element := range elements { if val := p.getEnumValue(rpcField.EnumName, element); val != nil { itemsField.Append(*val) } } default: - for _, element := range arr { - itemsField.Append(p.setValueForKind(DataType(fieldDesc.Kind().String()), element)) + for _, element := range elements { + itemsField.Append(p.setValueForKind(DataType(itemsFieldDesc.Kind().String()), element)) } } - rootMsg.Set(fieldDesc, protoref.ValueOfList(itemsField)) - return rootMsg - } - - // For nested Lists we always expect a "list" field in the root message with field number 1 - listFieldDesc := rootMsg.Descriptor().Fields().ByNumber(1) - if listFieldDesc == nil { - p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, rootMsg.Descriptor().Name())) - return nil - } - - elements := data.Array() - newListField := rootMsg.NewField(listFieldDesc) - if len(elements) == 0 { - if rpcField.ListMetadata.LevelInfo[level-1].Optional { - return nil - } - + itemsFieldMsg.Set(itemsFieldDesc, protoref.ValueOfList(itemsField)) rootMsg.Set(listFieldDesc, newListField) return rootMsg } - // Inside of a List message type we expect a repeated "items" field with field number 1 - itemsFieldMsg := newListField.Message() - itemsFieldDesc := itemsFieldMsg.Descriptor().Fields().ByNumber(1) - if itemsFieldDesc == nil { - p.report.AddInternalError(fmt.Errorf("field with number %d not found in message %s", 1, itemsFieldMsg.Descriptor().Name())) - return nil - } - - itemsField := itemsFieldMsg.Mutable(itemsFieldDesc) for _, element := range elements { - newElement := itemsField.List().NewElement() + newElement := itemsField.NewElement() if val := p.traverseList(newElement.Message(), level+1, field, rpcField, element); val != nil { - itemsField.List().Append(protoref.ValueOfMessage(val)) + itemsField.Append(protoref.ValueOfMessage(val)) } } rootMsg.Set(listFieldDesc, newListField) - return rootMsg } diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go b/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go index 8a6ab9daaf..4859896124 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler_test.go @@ -440,7 +440,9 @@ func TestCompileNestedLists(t *testing.T) { modifiersMsg := linesMsg.Get(modifiersDesc).Message() require.True(t, modifiersMsg.IsValid(), "expected modifiers message to be valid") - modifiersList := modifiersMsg.Get(modifiersMsg.Descriptor().Fields().ByName("items")).List() + modifiersListMsg := modifiersMsg.Get(modifiersMsg.Descriptor().Fields().ByName("list")).Message() + modifiersList := modifiersListMsg.Get(modifiersListMsg.Descriptor().Fields().ByName("items")).List() + require.True(t, modifiersList.IsValid(), "expected modifiers list to be valid") require.Equal(t, 2, modifiersList.Len()) require.Equal(t, "modifier1", modifiersList.Get(0).String()) diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go index fb50db0ce7..626b4a69f2 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource.go @@ -9,6 +9,7 @@ package grpcdatasource import ( "bytes" "context" + "errors" "fmt" "strconv" @@ -262,7 +263,11 @@ func (d *DataSource) marshalResponseJSON(arena *astjson.Arena, message *RPCMessa func (d *DataSource) flattenListStructure(arena *astjson.Arena, md *ListMetadata, data protoref.Message, message *RPCMessage) (*astjson.Value, error) { if md == nil { - return arena.NewNull(), fmt.Errorf("unable to flatten list structure: list metadata not found") + return arena.NewNull(), errors.New("unable to flatten list structure: list metadata not found") + } + + if len(md.LevelInfo) < md.NestingLevel { + return arena.NewNull(), errors.New("unable to flatten list structure: nesting level data does not match the number of levels in the list metadata") } if !data.IsValid() { @@ -270,7 +275,7 @@ func (d *DataSource) flattenListStructure(arena *astjson.Arena, md *ListMetadata return arena.NewNull(), nil } - return arena.NewNull(), fmt.Errorf("cannot add null item to response for non nullable list") + return arena.NewNull(), errors.New("cannot add null item to response for non nullable list") } root := arena.NewArray() @@ -288,25 +293,25 @@ func (d *DataSource) traverseList(level int, arena *astjson.Arena, current *astj return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field with number %d not found in message %q", 1, data.Descriptor().Name()) } - if level < md.NestingLevel-1 { - if fd.Kind() != protoref.MessageKind { - return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field %q is not a message", fd.Name()) - } - - msg := data.Get(fd).Message() - if !msg.IsValid() { - if md.LevelInfo[level].Optional { - return arena.NewNull(), nil - } + if fd.Kind() != protoref.MessageKind { + return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field %q is not a message", fd.Name()) + } - return arena.NewArray(), nil + msg := data.Get(fd).Message() + if !msg.IsValid() { + if md.LevelInfo[level].Optional { + return arena.NewNull(), nil } - fd = msg.Descriptor().Fields().ByNumber(1) - if !fd.IsList() { - return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field %q is not a list", fd.Name()) - } + return arena.NewArray(), nil + } + fd = msg.Descriptor().Fields().ByNumber(1) + if !fd.IsList() { + return arena.NewNull(), fmt.Errorf("unable to flatten list structure: field %q is not a list", fd.Name()) + } + + if level < md.NestingLevel-1 { list := msg.Get(fd).List() for i := 0; i < list.Len(); i++ { next := arena.NewArray() @@ -321,7 +326,7 @@ func (d *DataSource) traverseList(level int, arena *astjson.Arena, current *astj return current, nil } - list := data.Get(fd).List() + list := msg.Get(fd).List() if !list.IsValid() { if md.LevelInfo[level].Optional { return arena.NewNull(), nil diff --git a/v2/pkg/grpctest/mockservice.go b/v2/pkg/grpctest/mockservice.go index 927b9554ef..5ed322a21b 100644 --- a/v2/pkg/grpctest/mockservice.go +++ b/v2/pkg/grpctest/mockservice.go @@ -35,11 +35,11 @@ func convertCategoryInputsToCategories(inputs []*productv1.CategoryInput) []*pro } func convertCategoryInputListToCategories(inputs *productv1.ListOfCategoryInput) []*productv1.Category { - if inputs == nil || inputs.Items == nil { + if inputs == nil || inputs.List == nil || inputs.List.Items == nil { return nil } - results := make([]*productv1.Category, len(inputs.Items)) - for i, input := range inputs.Items { + results := make([]*productv1.Category, len(inputs.List.Items)) + for i, input := range inputs.List.Items { results[i] = &productv1.Category{ Id: fmt.Sprintf("cat-list-input-%d", i), Name: input.GetName(), @@ -50,11 +50,11 @@ func convertCategoryInputListToCategories(inputs *productv1.ListOfCategoryInput) } func convertUserInputsToUsers(inputs *productv1.ListOfUserInput) []*productv1.User { - if inputs == nil || inputs.Items == nil { + if inputs == nil || inputs.List == nil || inputs.List.Items == nil { return nil } - results := make([]*productv1.User, len(inputs.Items)) - for i, input := range inputs.Items { + results := make([]*productv1.User, len(inputs.List.Items)) + for i, input := range inputs.List.Items { results[i] = &productv1.User{ Id: fmt.Sprintf("user-input-%d", i), Name: input.GetName(), @@ -74,14 +74,18 @@ func convertNestedUserInputsToUsers(nestedInputs *productv1.ListOfListOfUserInpu results := make([]*productv1.ListOfUser, len(nestedInputs.List.Items)) for i, userList := range nestedInputs.List.Items { - users := make([]*productv1.User, len(userList.Items)) - for j, userInput := range userList.Items { + users := make([]*productv1.User, len(userList.List.Items)) + for j, userInput := range userList.List.Items { users[j] = &productv1.User{ Id: fmt.Sprintf("nested-user-%d-%d", i, j), Name: userInput.GetName(), } } - results[i] = &productv1.ListOfUser{Items: users} + results[i] = &productv1.ListOfUser{ + List: &productv1.ListOfUser_List{ + Items: users, + }, + } } return &productv1.ListOfListOfUser{ @@ -102,15 +106,19 @@ func convertNestedCategoryInputsToCategories(nestedInputs *productv1.ListOfListO results := make([]*productv1.ListOfCategory, len(nestedInputs.List.Items)) for i, categoryList := range nestedInputs.List.Items { - categories := make([]*productv1.Category, len(categoryList.Items)) - for j, categoryInput := range categoryList.Items { + categories := make([]*productv1.Category, len(categoryList.List.Items)) + for j, categoryInput := range categoryList.List.Items { categories[j] = &productv1.Category{ Id: fmt.Sprintf("nested-cat-%d-%d", i, j), Name: categoryInput.GetName(), Kind: categoryInput.GetKind(), } } - results[i] = &productv1.ListOfCategory{Items: categories} + results[i] = &productv1.ListOfCategory{ + List: &productv1.ListOfCategory_List{ + Items: categories, + }, + } } return &productv1.ListOfListOfCategory{ @@ -953,7 +961,9 @@ func (s *MockService) QueryCalculateTotals(ctx context.Context, in *productv1.Qu CustomerName: orderInput.GetCustomerName(), TotalItems: totalItems, OrderLines: &productv1.ListOfOrderLine{ - Items: orderLines, + List: &productv1.ListOfOrderLine_List{ + Items: orderLines, + }, }, }) } @@ -972,47 +982,59 @@ func (s *MockService) QueryBlogPost(ctx context.Context, in *productv1.QueryBlog Content: "This is a sample blog post content for testing nested lists.", Tags: []string{"tech", "programming", "go"}, OptionalTags: &productv1.ListOfString{ - Items: []string{"optional1", "optional2"}, + List: &productv1.ListOfString_List{ + Items: []string{"optional1", "optional2"}, + }, }, Categories: []string{"Technology", "", "Programming"}, // includes null/empty Keywords: &productv1.ListOfString{ - Items: []string{"keyword1", "keyword2"}, + List: &productv1.ListOfString_List{ + Items: []string{"keyword1", "keyword2"}, + }, }, ViewCounts: []int32{100, 150, 200, 250}, Ratings: &productv1.ListOfFloat{ - Items: []float64{4.5, 3.8, 5.0}, + List: &productv1.ListOfFloat_List{ + Items: []float64{4.5, 3.8, 5.0}, + }, }, IsPublished: &productv1.ListOfBoolean{ - Items: []bool{false, true, true}, + List: &productv1.ListOfBoolean_List{ + Items: []bool{false, true, true}, + }, }, TagGroups: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"tech", "programming"}}, - {Items: []string{"golang", "backend"}}, + {List: &productv1.ListOfString_List{ + Items: []string{"tech", "programming"}, + }}, + {List: &productv1.ListOfString_List{ + Items: []string{"golang", "backend"}, + }}, }, }, }, RelatedTopics: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"microservices", "api"}}, - {Items: []string{"databases", "performance"}}, + {List: &productv1.ListOfString_List{Items: []string{"microservices", "api"}}}, + {List: &productv1.ListOfString_List{Items: []string{"databases", "performance"}}}, }, }, }, CommentThreads: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Great post!", "Very helpful"}}, - {Items: []string{"Could use more examples", "Thanks for sharing"}}, + {List: &productv1.ListOfString_List{Items: []string{"Great post!", "Very helpful"}}}, + {List: &productv1.ListOfString_List{Items: []string{"Could use more examples", "Thanks for sharing"}}}, }, }, }, Suggestions: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Add code examples", "Include diagrams"}}, + {List: &productv1.ListOfString_List{Items: []string{"Add code examples", "Include diagrams"}}}, }, }, }, @@ -1025,21 +1047,27 @@ func (s *MockService) QueryBlogPost(ctx context.Context, in *productv1.QueryBlog {Id: "user-2", Name: "Jane Smith"}, }, MentionedProducts: &productv1.ListOfProduct{ - Items: []*productv1.Product{ - {Id: "prod-1", Name: "Sample Product", Price: 99.99}, + List: &productv1.ListOfProduct_List{ + Items: []*productv1.Product{ + {Id: "prod-1", Name: "Sample Product", Price: 99.99}, + }, }, }, MentionedUsers: &productv1.ListOfUser{ - Items: []*productv1.User{ - {Id: "user-3", Name: "Bob Johnson"}, + List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "user-3", Name: "Bob Johnson"}, + }, }, }, CategoryGroups: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: "cat-3", Name: "Web Development", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, - {Id: "cat-4", Name: "Backend", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "cat-3", Name: "Web Development", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-4", Name: "Backend", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }, }}, }, }, @@ -1047,9 +1075,11 @@ func (s *MockService) QueryBlogPost(ctx context.Context, in *productv1.QueryBlog ContributorTeams: &productv1.ListOfListOfUser{ List: &productv1.ListOfListOfUser_List{ Items: []*productv1.ListOfUser{ - {Items: []*productv1.User{ - {Id: "user-4", Name: "Alice Brown"}, - {Id: "user-5", Name: "Charlie Wilson"}, + {List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "user-4", Name: "Alice Brown"}, + {Id: "user-5", Name: "Charlie Wilson"}, + }, }}, }, }, @@ -1087,21 +1117,21 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query TagGroups: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"simple"}}, + {List: &productv1.ListOfString_List{Items: []string{"simple"}}}, }, }, }, RelatedTopics: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"basic"}}, + {List: &productv1.ListOfString_List{Items: []string{"basic"}}}, }, }, }, CommentThreads: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Nice post"}}, + {List: &productv1.ListOfString_List{Items: []string{"Nice post"}}}, }, }, }, @@ -1115,8 +1145,10 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query CategoryGroups: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: "cat-group-simple", Name: "Simple Category", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "cat-group-simple", Name: "Simple Category", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1129,50 +1161,58 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query Content: "Complex content with comprehensive lists", Tags: []string{"complex", "advanced", "detailed"}, OptionalTags: &productv1.ListOfString{ - Items: []string{"deep-dive", "tutorial"}, + List: &productv1.ListOfString_List{ + Items: []string{"deep-dive", "tutorial"}, + }, }, Categories: []string{"Advanced", "Tutorial", "Guide"}, Keywords: &productv1.ListOfString{ - Items: []string{"advanced", "complex", "comprehensive"}, + List: &productv1.ListOfString_List{ + Items: []string{"advanced", "complex", "comprehensive"}, + }, }, ViewCounts: []int32{500, 600, 750, 800, 950}, Ratings: &productv1.ListOfFloat{ - Items: []float64{4.8, 4.9, 4.7, 5.0}, + List: &productv1.ListOfFloat_List{ + Items: []float64{4.8, 4.9, 4.7, 5.0}, + }, }, IsPublished: &productv1.ListOfBoolean{ - Items: []bool{false, false, true, true}, + List: &productv1.ListOfBoolean_List{ + Items: []bool{false, false, true, true}, + }, }, TagGroups: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"advanced", "expert"}}, - {Items: []string{"tutorial", "guide", "comprehensive"}}, - {Items: []string{"deep-dive", "detailed"}}, + {List: &productv1.ListOfString_List{Items: []string{"advanced", "expert"}}}, + {List: &productv1.ListOfString_List{Items: []string{"tutorial", "guide", "comprehensive"}}}, + {List: &productv1.ListOfString_List{Items: []string{"deep-dive", "detailed"}}}, }, }, }, RelatedTopics: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"architecture", "patterns", "design"}}, - {Items: []string{"optimization", "performance", "scaling"}}, + {List: &productv1.ListOfString_List{Items: []string{"architecture", "patterns", "design"}}}, + {List: &productv1.ListOfString_List{Items: []string{"optimization", "performance", "scaling"}}}, }, }, }, CommentThreads: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Excellent deep dive!", "Very thorough"}}, - {Items: []string{"Could be longer", "More examples please"}}, - {Items: []string{"Best tutorial I've read", "Thank you!"}}, + {List: &productv1.ListOfString_List{Items: []string{"Excellent deep dive!", "Very thorough"}}}, + {List: &productv1.ListOfString_List{Items: []string{"Could be longer", "More examples please"}}}, + {List: &productv1.ListOfString_List{Items: []string{"Best tutorial I've read", "Thank you!"}}}, }, }, }, Suggestions: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Add video content", "Include interactive examples"}}, - {Items: []string{"Create follow-up posts", "Add Q&A section"}}, + {List: &productv1.ListOfString_List{Items: []string{"Add video content", "Include interactive examples"}}}, + {List: &productv1.ListOfString_List{Items: []string{"Create follow-up posts", "Add Q&A section"}}}, }, }, }, @@ -1186,25 +1226,33 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query {Id: "user-complex-2", Name: "Technical Reviewer"}, }, MentionedProducts: &productv1.ListOfProduct{ - Items: []*productv1.Product{ - {Id: "prod-complex-1", Name: "Advanced IDE", Price: 299.99}, - {Id: "prod-complex-2", Name: "Profiling Tool", Price: 149.99}, + List: &productv1.ListOfProduct_List{ + Items: []*productv1.Product{ + {Id: "prod-complex-1", Name: "Advanced IDE", Price: 299.99}, + {Id: "prod-complex-2", Name: "Profiling Tool", Price: 149.99}, + }, }, }, MentionedUsers: &productv1.ListOfUser{ - Items: []*productv1.User{ - {Id: "user-complex-3", Name: "Referenced Expert"}, + List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "user-complex-3", Name: "Referenced Expert"}, + }, }, }, CategoryGroups: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: "cat-group-1", Name: "System Design", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, - {Id: "cat-group-2", Name: "Architecture Patterns", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "cat-group-1", Name: "System Design", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-group-2", Name: "Architecture Patterns", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }, }}, - {Items: []*productv1.Category{ - {Id: "cat-group-3", Name: "Performance", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "cat-group-3", Name: "Performance", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }, }}, }, }, @@ -1212,12 +1260,16 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query ContributorTeams: &productv1.ListOfListOfUser{ List: &productv1.ListOfListOfUser_List{ Items: []*productv1.ListOfUser{ - {Items: []*productv1.User{ - {Id: "team-complex-1", Name: "Senior Engineer A"}, - {Id: "team-complex-2", Name: "Senior Engineer B"}, + {List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "team-complex-1", Name: "Senior Engineer A"}, + {Id: "team-complex-2", Name: "Senior Engineer B"}, + }, }}, - {Items: []*productv1.User{ - {Id: "team-complex-3", Name: "QA Lead"}, + {List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "team-complex-3", Name: "QA Lead"}, + }, }}, }, }, @@ -1236,21 +1288,27 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query TagGroups: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("tag-%s", id), "group"}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("tag-%s", id), "group"}, + }}, }, }, }, RelatedTopics: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("topic-%s", id)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("topic-%s", id)}, + }}, }, }, }, CommentThreads: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("Comment on %s", id)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("Comment on %s", id)}, + }}, }, }, }, @@ -1264,8 +1322,10 @@ func (s *MockService) QueryBlogPostById(ctx context.Context, in *productv1.Query CategoryGroups: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: fmt.Sprintf("cat-group-%s", id), Name: fmt.Sprintf("Group Category %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-group-%s", id), Name: fmt.Sprintf("Group Category %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1333,21 +1393,27 @@ func (s *MockService) QueryBlogPostsWithFilter(ctx context.Context, in *productv TagGroups: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("filtered-tag-%d", i)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("filtered-tag-%d", i)}, + }}, }, }, }, RelatedTopics: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("filtered-topic-%d", i)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("filtered-topic-%d", i)}, + }}, }, }, }, CommentThreads: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("Filtered comment %d", i)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("Filtered comment %d", i)}, + }}, }, }, }, @@ -1361,8 +1427,10 @@ func (s *MockService) QueryBlogPostsWithFilter(ctx context.Context, in *productv CategoryGroups: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: fmt.Sprintf("cat-group-filtered-%d", i), Name: fmt.Sprintf("Filtered Group %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-group-filtered-%d", i), Name: fmt.Sprintf("Filtered Group %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1387,19 +1455,25 @@ func (s *MockService) QueryAllBlogPosts(ctx context.Context, in *productv1.Query // Vary the optional fields if i%2 == 1 { optionalTags = &productv1.ListOfString{ - Items: []string{fmt.Sprintf("optional%d", i), "common"}, + List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("optional%d", i), "common"}, + }, } } if i%3 == 0 { keywords = &productv1.ListOfString{ - Items: []string{fmt.Sprintf("keyword%d", i)}, + List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("keyword%d", i)}, + }, } } if i%2 == 0 { ratings = &productv1.ListOfFloat{ - Items: []float64{float64(i) + 0.5, float64(i) + 1.0}, + List: &productv1.ListOfFloat_List{ + Items: []float64{float64(i) + 0.5, float64(i) + 1.0}, + }, } } @@ -1414,26 +1488,34 @@ func (s *MockService) QueryAllBlogPosts(ctx context.Context, in *productv1.Query ViewCounts: []int32{int32(i * 100), int32(i * 150)}, Ratings: ratings, IsPublished: &productv1.ListOfBoolean{ - Items: []bool{i%2 == 0, true}, + List: &productv1.ListOfBoolean_List{ + Items: []bool{i%2 == 0, true}, + }, }, TagGroups: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("group%d", i), "shared"}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("group%d", i), "shared"}, + }}, }, }, }, RelatedTopics: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("topic%d", i)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("topic%d", i)}, + }}, }, }, }, CommentThreads: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("Comment for post %d", i)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("Comment for post %d", i)}, + }}, }, }, }, @@ -1447,8 +1529,10 @@ func (s *MockService) QueryAllBlogPosts(ctx context.Context, in *productv1.Query CategoryGroups: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: fmt.Sprintf("cat-group-all-%d", i), Name: fmt.Sprintf("Group Category %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-group-all-%d", i), Name: fmt.Sprintf("Group Category %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1474,28 +1558,40 @@ func (s *MockService) QueryAuthor(ctx context.Context, in *productv1.QueryAuthor Skills: []string{"Go", "GraphQL", "Protocol Buffers"}, Languages: []string{"English", "Spanish", ""}, SocialLinks: &productv1.ListOfString{ - Items: []string{"https://twitter.com/author", "https://linkedin.com/in/author"}, + List: &productv1.ListOfString_List{ + Items: []string{"https://twitter.com/author", "https://linkedin.com/in/author"}, + }, }, TeamsByProject: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Alice", "Bob", "Charlie"}}, - {Items: []string{"David", "Eve"}}, + {List: &productv1.ListOfString_List{ + Items: []string{"Alice", "Bob", "Charlie"}, + }}, + {List: &productv1.ListOfString_List{ + Items: []string{"David", "Eve"}, + }}, }, }, }, Collaborations: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Open Source Project A", "Research Paper B"}}, - {Items: []string{"Conference Talk C"}}, + {List: &productv1.ListOfString_List{ + Items: []string{"Open Source Project A", "Research Paper B"}, + }}, + {List: &productv1.ListOfString_List{ + Items: []string{"Conference Talk C"}, + }}, }, }, }, WrittenPosts: &productv1.ListOfBlogPost{ - Items: []*productv1.BlogPost{ - {Id: "blog-1", Title: "GraphQL Best Practices", Content: "Content here..."}, - {Id: "blog-2", Title: "gRPC vs REST", Content: "Comparison content..."}, + List: &productv1.ListOfBlogPost_List{ + Items: []*productv1.BlogPost{ + {Id: "blog-1", Title: "GraphQL Best Practices", Content: "Content here..."}, + {Id: "blog-2", Title: "gRPC vs REST", Content: "Comparison content..."}, + }, }, }, FavoriteCategories: []*productv1.Category{ @@ -1503,25 +1599,33 @@ func (s *MockService) QueryAuthor(ctx context.Context, in *productv1.QueryAuthor {Id: "cat-fav-2", Name: "Technical Writing", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, }, RelatedAuthors: &productv1.ListOfUser{ - Items: []*productv1.User{ - {Id: "author-rel-1", Name: "Related Author One"}, - {Id: "author-rel-2", Name: "Related Author Two"}, + List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "author-rel-1", Name: "Related Author One"}, + {Id: "author-rel-2", Name: "Related Author Two"}, + }, }, }, ProductReviews: &productv1.ListOfProduct{ - Items: []*productv1.Product{ - {Id: "prod-rev-1", Name: "Code Editor Pro", Price: 199.99}, + List: &productv1.ListOfProduct_List{ + Items: []*productv1.Product{ + {Id: "prod-rev-1", Name: "Code Editor Pro", Price: 199.99}, + }, }, }, AuthorGroups: &productv1.ListOfListOfUser{ List: &productv1.ListOfListOfUser_List{ Items: []*productv1.ListOfUser{ - {Items: []*productv1.User{ - {Id: "group-auth-1", Name: "Team Lead Alpha"}, - {Id: "group-auth-2", Name: "Senior Dev Beta"}, + {List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "group-auth-1", Name: "Team Lead Alpha"}, + {Id: "group-auth-2", Name: "Senior Dev Beta"}, + }, }}, - {Items: []*productv1.User{ - {Id: "group-auth-3", Name: "Junior Dev Gamma"}, + {List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "group-auth-3", Name: "Junior Dev Gamma"}, + }, }}, }, }, @@ -1529,9 +1633,11 @@ func (s *MockService) QueryAuthor(ctx context.Context, in *productv1.QueryAuthor CategoryPreferences: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: "pref-cat-1", Name: "Microservices", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, - {Id: "pref-cat-2", Name: "Cloud Computing", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "pref-cat-1", Name: "Microservices", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "pref-cat-2", Name: "Cloud Computing", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }, }}, }, }, @@ -1565,7 +1671,9 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu TeamsByProject: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Solo"}}, + {List: &productv1.ListOfString_List{ + Items: []string{"Solo"}, + }}, }, }, }, @@ -1576,8 +1684,10 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu CategoryPreferences: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: "cat-pref-minimal", Name: "Minimal Preference", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "cat-pref-minimal", Name: "Minimal Preference", Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1595,26 +1705,38 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu Skills: []string{"Go", "GraphQL", "gRPC", "Microservices", "Kubernetes"}, Languages: []string{"English", "French", "German"}, SocialLinks: &productv1.ListOfString{ - Items: []string{ - "https://github.com/experienced", - "https://twitter.com/experienced", - "https://medium.com/@experienced", + List: &productv1.ListOfString_List{ + Items: []string{ + "https://github.com/experienced", + "https://twitter.com/experienced", + "https://medium.com/@experienced", + }, }, }, TeamsByProject: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Senior Dev 1", "Senior Dev 2", "Tech Lead"}}, - {Items: []string{"Architect", "Principal Engineer"}}, - {Items: []string{"PM", "Designer", "QA Lead"}}, + {List: &productv1.ListOfString_List{ + Items: []string{"Senior Dev 1", "Senior Dev 2", "Tech Lead"}, + }}, + {List: &productv1.ListOfString_List{ + Items: []string{"Architect", "Principal Engineer"}, + }}, + {List: &productv1.ListOfString_List{ + Items: []string{"PM", "Designer", "QA Lead"}, + }}, }, }, }, Collaborations: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Major OSS Project", "Industry Standard", "Research Initiative"}}, - {Items: []string{"Conference Keynote", "Workshop Series"}}, + {List: &productv1.ListOfString_List{ + Items: []string{"Major OSS Project", "Industry Standard", "Research Initiative"}, + }}, + {List: &productv1.ListOfString_List{ + Items: []string{"Conference Keynote", "Workshop Series"}, + }}, }, }, }, @@ -1626,9 +1748,11 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu CategoryPreferences: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: "cat-pref-experienced-1", Name: "System Architecture", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, - {Id: "cat-pref-experienced-2", Name: "Team Management", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "cat-pref-experienced-1", Name: "System Architecture", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {Id: "cat-pref-experienced-2", Name: "Team Management", Kind: productv1.CategoryKind_CATEGORY_KIND_BOOK}, + }, }}, }, }, @@ -1646,7 +1770,9 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu TeamsByProject: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("Team-%s", id)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("Team-%s", id)}, + }}, }, }, }, @@ -1657,8 +1783,10 @@ func (s *MockService) QueryAuthorById(ctx context.Context, in *productv1.QueryAu CategoryPreferences: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: fmt.Sprintf("cat-pref-%s", id), Name: fmt.Sprintf("Preference %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-pref-%s", id), Name: fmt.Sprintf("Preference %s", id), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1716,7 +1844,9 @@ func (s *MockService) QueryAuthorsWithFilter(ctx context.Context, in *productv1. teamsByProject = &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("Team%d", i), "SharedTeam"}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("Team%d", i), "SharedTeam"}, + }}, }, }, } @@ -1737,8 +1867,10 @@ func (s *MockService) QueryAuthorsWithFilter(ctx context.Context, in *productv1. CategoryPreferences: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: fmt.Sprintf("cat-pref-filtered-%d", i), Name: fmt.Sprintf("Filtered Preference %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-pref-filtered-%d", i), Name: fmt.Sprintf("Filtered Preference %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1769,7 +1901,9 @@ func (s *MockService) QueryAllAuthors(ctx context.Context, in *productv1.QueryAl if i%3 == 0 { socialLinks = &productv1.ListOfString{ - Items: []string{fmt.Sprintf("https://github.com/author%d", i)}, + List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("https://github.com/author%d", i)}, + }, } } @@ -1777,7 +1911,9 @@ func (s *MockService) QueryAllAuthors(ctx context.Context, in *productv1.QueryAl collaborations = &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{"Collaboration A", "Collaboration B"}}, + {List: &productv1.ListOfString_List{ + Items: []string{"Collaboration A", "Collaboration B"}, + }}, }, }, } @@ -1795,7 +1931,9 @@ func (s *MockService) QueryAllAuthors(ctx context.Context, in *productv1.QueryAl TeamsByProject: &productv1.ListOfListOfString{ List: &productv1.ListOfListOfString_List{ Items: []*productv1.ListOfString{ - {Items: []string{fmt.Sprintf("Team%d", i)}}, + {List: &productv1.ListOfString_List{ + Items: []string{fmt.Sprintf("Team%d", i)}, + }}, }, }, }, @@ -1806,8 +1944,10 @@ func (s *MockService) QueryAllAuthors(ctx context.Context, in *productv1.QueryAl CategoryPreferences: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: fmt.Sprintf("cat-pref-all-%d", i), Name: fmt.Sprintf("All Preference %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: fmt.Sprintf("cat-pref-all-%d", i), Name: fmt.Sprintf("All Preference %d", i), Kind: productv1.CategoryKind_CATEGORY_KIND_OTHER}, + }, }}, }, }, @@ -1846,20 +1986,26 @@ func (s *MockService) MutationCreateBlogPost(ctx context.Context, in *productv1. Contributors: convertUserInputsToUsers(input.GetContributors()), CategoryGroups: convertNestedCategoryInputsToCategories(input.GetCategoryGroups()), MentionedProducts: &productv1.ListOfProduct{ - Items: []*productv1.Product{ - {Id: "prod-1", Name: "Sample Product", Price: 99.99}, + List: &productv1.ListOfProduct_List{ + Items: []*productv1.Product{ + {Id: "prod-1", Name: "Sample Product", Price: 99.99}, + }, }, }, MentionedUsers: &productv1.ListOfUser{ - Items: []*productv1.User{ - {Id: "user-3", Name: "Bob Johnson"}, + List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "user-3", Name: "Bob Johnson"}, + }, }, }, ContributorTeams: &productv1.ListOfListOfUser{ List: &productv1.ListOfListOfUser_List{ Items: []*productv1.ListOfUser{ - {Items: []*productv1.User{ - {Id: "user-4", Name: "Alice Brown"}, + {List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "user-4", Name: "Alice Brown"}, + }, }}, }, }, @@ -1922,25 +2068,33 @@ func (s *MockService) MutationCreateAuthor(ctx context.Context, in *productv1.Mu ProjectTeams: convertNestedUserInputsToUsers(input.GetProjectTeams()), // Keep other complex fields with mock data since they're not in the simplified input WrittenPosts: &productv1.ListOfBlogPost{ - Items: []*productv1.BlogPost{ - {Id: "blog-created", Title: "Created Post", Content: "Content..."}, + List: &productv1.ListOfBlogPost_List{ + Items: []*productv1.BlogPost{ + {Id: "blog-created", Title: "Created Post", Content: "Content..."}, + }, }, }, RelatedAuthors: &productv1.ListOfUser{ - Items: []*productv1.User{ - {Id: "related-author", Name: "Related Author"}, + List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "related-author", Name: "Related Author"}, + }, }, }, ProductReviews: &productv1.ListOfProduct{ - Items: []*productv1.Product{ - {Id: "reviewed-product", Name: "Code Editor", Price: 199.99}, + List: &productv1.ListOfProduct_List{ + Items: []*productv1.Product{ + {Id: "reviewed-product", Name: "Code Editor", Price: 199.99}, + }, }, }, CategoryPreferences: &productv1.ListOfListOfCategory{ List: &productv1.ListOfListOfCategory_List{ Items: []*productv1.ListOfCategory{ - {Items: []*productv1.Category{ - {Id: "pref-cat", Name: "Backend Development", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "pref-cat", Name: "Backend Development", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }, }}, }, }, diff --git a/v2/pkg/grpctest/product.proto b/v2/pkg/grpctest/product.proto index 00fd19086e..1106e9be0b 100644 --- a/v2/pkg/grpctest/product.proto +++ b/v2/pkg/grpctest/product.proto @@ -51,29 +51,39 @@ service ProductService { // Wrapper message for a list of BlogPost. message ListOfBlogPost { - repeated BlogPost items = 1; + message List { + repeated BlogPost items = 1; + } + List list = 1; } - // Wrapper message for a list of Boolean. message ListOfBoolean { - repeated bool items = 1; + message List { + repeated bool items = 1; + } + List list = 1; } - // Wrapper message for a list of Category. message ListOfCategory { - repeated Category items = 1; + message List { + repeated Category items = 1; + } + List list = 1; } - // Wrapper message for a list of CategoryInput. message ListOfCategoryInput { - repeated CategoryInput items = 1; + message List { + repeated CategoryInput items = 1; + } + List list = 1; } - // Wrapper message for a list of Float. message ListOfFloat { - repeated double items = 1; + message List { + repeated double items = 1; + } + List list = 1; } - // Wrapper message for a list of Category. message ListOfListOfCategory { message List { @@ -81,7 +91,6 @@ message ListOfListOfCategory { } List list = 1; } - // Wrapper message for a list of CategoryInput. message ListOfListOfCategoryInput { message List { @@ -89,7 +98,6 @@ message ListOfListOfCategoryInput { } List list = 1; } - // Wrapper message for a list of String. message ListOfListOfString { message List { @@ -97,7 +105,6 @@ message ListOfListOfString { } List list = 1; } - // Wrapper message for a list of User. message ListOfListOfUser { message List { @@ -105,7 +112,6 @@ message ListOfListOfUser { } List list = 1; } - // Wrapper message for a list of UserInput. message ListOfListOfUserInput { message List { @@ -113,32 +119,41 @@ message ListOfListOfUserInput { } List list = 1; } - // Wrapper message for a list of OrderLine. message ListOfOrderLine { - repeated OrderLine items = 1; + message List { + repeated OrderLine items = 1; + } + List list = 1; } - // Wrapper message for a list of Product. message ListOfProduct { - repeated Product items = 1; + message List { + repeated Product items = 1; + } + List list = 1; } - // Wrapper message for a list of String. message ListOfString { - repeated string items = 1; + message List { + repeated string items = 1; + } + List list = 1; } - // Wrapper message for a list of User. message ListOfUser { - repeated User items = 1; + message List { + repeated User items = 1; + } + List list = 1; } - // Wrapper message for a list of UserInput. message ListOfUserInput { - repeated UserInput items = 1; + message List { + repeated UserInput items = 1; + } + List list = 1; } - // Key message for Product entity lookup message LookupProductByIdRequestKey { // Key field for Product entity lookup. diff --git a/v2/pkg/grpctest/productv1/product.pb.go b/v2/pkg/grpctest/productv1/product.pb.go index 3dff43ec54..ce1d1f6cb2 100644 --- a/v2/pkg/grpctest/productv1/product.pb.go +++ b/v2/pkg/grpctest/productv1/product.pb.go @@ -80,7 +80,7 @@ func (CategoryKind) EnumDescriptor() ([]byte, []int) { // Wrapper message for a list of BlogPost. type ListOfBlogPost struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []*BlogPost `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + List *ListOfBlogPost_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -115,9 +115,9 @@ func (*ListOfBlogPost) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{0} } -func (x *ListOfBlogPost) GetItems() []*BlogPost { +func (x *ListOfBlogPost) GetList() *ListOfBlogPost_List { if x != nil { - return x.Items + return x.List } return nil } @@ -125,7 +125,7 @@ func (x *ListOfBlogPost) GetItems() []*BlogPost { // Wrapper message for a list of Boolean. type ListOfBoolean struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []bool `protobuf:"varint,1,rep,packed,name=items,proto3" json:"items,omitempty"` + List *ListOfBoolean_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -160,9 +160,9 @@ func (*ListOfBoolean) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{1} } -func (x *ListOfBoolean) GetItems() []bool { +func (x *ListOfBoolean) GetList() *ListOfBoolean_List { if x != nil { - return x.Items + return x.List } return nil } @@ -170,7 +170,7 @@ func (x *ListOfBoolean) GetItems() []bool { // Wrapper message for a list of Category. type ListOfCategory struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []*Category `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + List *ListOfCategory_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -205,17 +205,17 @@ func (*ListOfCategory) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{2} } -func (x *ListOfCategory) GetItems() []*Category { +func (x *ListOfCategory) GetList() *ListOfCategory_List { if x != nil { - return x.Items + return x.List } return nil } // Wrapper message for a list of CategoryInput. type ListOfCategoryInput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Items []*CategoryInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + List *ListOfCategoryInput_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -250,9 +250,9 @@ func (*ListOfCategoryInput) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{3} } -func (x *ListOfCategoryInput) GetItems() []*CategoryInput { +func (x *ListOfCategoryInput) GetList() *ListOfCategoryInput_List { if x != nil { - return x.Items + return x.List } return nil } @@ -260,7 +260,7 @@ func (x *ListOfCategoryInput) GetItems() []*CategoryInput { // Wrapper message for a list of Float. type ListOfFloat struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []float64 `protobuf:"fixed64,1,rep,packed,name=items,proto3" json:"items,omitempty"` + List *ListOfFloat_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -295,9 +295,9 @@ func (*ListOfFloat) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{4} } -func (x *ListOfFloat) GetItems() []float64 { +func (x *ListOfFloat) GetList() *ListOfFloat_List { if x != nil { - return x.Items + return x.List } return nil } @@ -530,7 +530,7 @@ func (x *ListOfListOfUserInput) GetList() *ListOfListOfUserInput_List { // Wrapper message for a list of OrderLine. type ListOfOrderLine struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []*OrderLine `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + List *ListOfOrderLine_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -565,9 +565,9 @@ func (*ListOfOrderLine) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{10} } -func (x *ListOfOrderLine) GetItems() []*OrderLine { +func (x *ListOfOrderLine) GetList() *ListOfOrderLine_List { if x != nil { - return x.Items + return x.List } return nil } @@ -575,7 +575,7 @@ func (x *ListOfOrderLine) GetItems() []*OrderLine { // Wrapper message for a list of Product. type ListOfProduct struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []*Product `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + List *ListOfProduct_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -610,9 +610,9 @@ func (*ListOfProduct) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{11} } -func (x *ListOfProduct) GetItems() []*Product { +func (x *ListOfProduct) GetList() *ListOfProduct_List { if x != nil { - return x.Items + return x.List } return nil } @@ -620,7 +620,7 @@ func (x *ListOfProduct) GetItems() []*Product { // Wrapper message for a list of String. type ListOfString struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []string `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + List *ListOfString_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -655,9 +655,9 @@ func (*ListOfString) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{12} } -func (x *ListOfString) GetItems() []string { +func (x *ListOfString) GetList() *ListOfString_List { if x != nil { - return x.Items + return x.List } return nil } @@ -665,7 +665,7 @@ func (x *ListOfString) GetItems() []string { // Wrapper message for a list of User. type ListOfUser struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []*User `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + List *ListOfUser_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -700,9 +700,9 @@ func (*ListOfUser) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{13} } -func (x *ListOfUser) GetItems() []*User { +func (x *ListOfUser) GetList() *ListOfUser_List { if x != nil { - return x.Items + return x.List } return nil } @@ -710,7 +710,7 @@ func (x *ListOfUser) GetItems() []*User { // Wrapper message for a list of UserInput. type ListOfUserInput struct { state protoimpl.MessageState `protogen:"open.v1"` - Items []*UserInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + List *ListOfUserInput_List `protobuf:"bytes,1,opt,name=list,proto3" json:"list,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -745,9 +745,9 @@ func (*ListOfUserInput) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{14} } -func (x *ListOfUserInput) GetItems() []*UserInput { +func (x *ListOfUserInput) GetList() *ListOfUserInput_List { if x != nil { - return x.Items + return x.List } return nil } @@ -7028,6 +7028,226 @@ func (x *CategoryInput) GetKind() CategoryKind { return CategoryKind_CATEGORY_KIND_UNSPECIFIED } +type ListOfBlogPost_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*BlogPost `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfBlogPost_List) Reset() { + *x = ListOfBlogPost_List{} + mi := &file_product_proto_msgTypes[132] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfBlogPost_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfBlogPost_List) ProtoMessage() {} + +func (x *ListOfBlogPost_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[132] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfBlogPost_List.ProtoReflect.Descriptor instead. +func (*ListOfBlogPost_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *ListOfBlogPost_List) GetItems() []*BlogPost { + if x != nil { + return x.Items + } + return nil +} + +type ListOfBoolean_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []bool `protobuf:"varint,1,rep,packed,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfBoolean_List) Reset() { + *x = ListOfBoolean_List{} + mi := &file_product_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfBoolean_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfBoolean_List) ProtoMessage() {} + +func (x *ListOfBoolean_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[133] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfBoolean_List.ProtoReflect.Descriptor instead. +func (*ListOfBoolean_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{1, 0} +} + +func (x *ListOfBoolean_List) GetItems() []bool { + if x != nil { + return x.Items + } + return nil +} + +type ListOfCategory_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*Category `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfCategory_List) Reset() { + *x = ListOfCategory_List{} + mi := &file_product_proto_msgTypes[134] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfCategory_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfCategory_List) ProtoMessage() {} + +func (x *ListOfCategory_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[134] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfCategory_List.ProtoReflect.Descriptor instead. +func (*ListOfCategory_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *ListOfCategory_List) GetItems() []*Category { + if x != nil { + return x.Items + } + return nil +} + +type ListOfCategoryInput_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*CategoryInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfCategoryInput_List) Reset() { + *x = ListOfCategoryInput_List{} + mi := &file_product_proto_msgTypes[135] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfCategoryInput_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfCategoryInput_List) ProtoMessage() {} + +func (x *ListOfCategoryInput_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[135] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfCategoryInput_List.ProtoReflect.Descriptor instead. +func (*ListOfCategoryInput_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *ListOfCategoryInput_List) GetItems() []*CategoryInput { + if x != nil { + return x.Items + } + return nil +} + +type ListOfFloat_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []float64 `protobuf:"fixed64,1,rep,packed,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfFloat_List) Reset() { + *x = ListOfFloat_List{} + mi := &file_product_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfFloat_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfFloat_List) ProtoMessage() {} + +func (x *ListOfFloat_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[136] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfFloat_List.ProtoReflect.Descriptor instead. +func (*ListOfFloat_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{4, 0} +} + +func (x *ListOfFloat_List) GetItems() []float64 { + if x != nil { + return x.Items + } + return nil +} + type ListOfListOfCategory_List struct { state protoimpl.MessageState `protogen:"open.v1"` Items []*ListOfCategory `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` @@ -7037,7 +7257,7 @@ type ListOfListOfCategory_List struct { func (x *ListOfListOfCategory_List) Reset() { *x = ListOfListOfCategory_List{} - mi := &file_product_proto_msgTypes[132] + mi := &file_product_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7049,7 +7269,7 @@ func (x *ListOfListOfCategory_List) String() string { func (*ListOfListOfCategory_List) ProtoMessage() {} func (x *ListOfListOfCategory_List) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[132] + mi := &file_product_proto_msgTypes[137] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7081,7 +7301,7 @@ type ListOfListOfCategoryInput_List struct { func (x *ListOfListOfCategoryInput_List) Reset() { *x = ListOfListOfCategoryInput_List{} - mi := &file_product_proto_msgTypes[133] + mi := &file_product_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7093,7 +7313,7 @@ func (x *ListOfListOfCategoryInput_List) String() string { func (*ListOfListOfCategoryInput_List) ProtoMessage() {} func (x *ListOfListOfCategoryInput_List) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[133] + mi := &file_product_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7125,7 +7345,7 @@ type ListOfListOfString_List struct { func (x *ListOfListOfString_List) Reset() { *x = ListOfListOfString_List{} - mi := &file_product_proto_msgTypes[134] + mi := &file_product_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7137,7 +7357,7 @@ func (x *ListOfListOfString_List) String() string { func (*ListOfListOfString_List) ProtoMessage() {} func (x *ListOfListOfString_List) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[134] + mi := &file_product_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7169,7 +7389,7 @@ type ListOfListOfUser_List struct { func (x *ListOfListOfUser_List) Reset() { *x = ListOfListOfUser_List{} - mi := &file_product_proto_msgTypes[135] + mi := &file_product_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7181,7 +7401,7 @@ func (x *ListOfListOfUser_List) String() string { func (*ListOfListOfUser_List) ProtoMessage() {} func (x *ListOfListOfUser_List) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[135] + mi := &file_product_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7213,7 +7433,7 @@ type ListOfListOfUserInput_List struct { func (x *ListOfListOfUserInput_List) Reset() { *x = ListOfListOfUserInput_List{} - mi := &file_product_proto_msgTypes[136] + mi := &file_product_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7225,7 +7445,7 @@ func (x *ListOfListOfUserInput_List) String() string { func (*ListOfListOfUserInput_List) ProtoMessage() {} func (x *ListOfListOfUserInput_List) ProtoReflect() protoreflect.Message { - mi := &file_product_proto_msgTypes[136] + mi := &file_product_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7248,20 +7468,250 @@ func (x *ListOfListOfUserInput_List) GetItems() []*ListOfUserInput { return nil } +type ListOfOrderLine_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*OrderLine `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfOrderLine_List) Reset() { + *x = ListOfOrderLine_List{} + mi := &file_product_proto_msgTypes[142] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfOrderLine_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfOrderLine_List) ProtoMessage() {} + +func (x *ListOfOrderLine_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[142] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfOrderLine_List.ProtoReflect.Descriptor instead. +func (*ListOfOrderLine_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{10, 0} +} + +func (x *ListOfOrderLine_List) GetItems() []*OrderLine { + if x != nil { + return x.Items + } + return nil +} + +type ListOfProduct_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*Product `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfProduct_List) Reset() { + *x = ListOfProduct_List{} + mi := &file_product_proto_msgTypes[143] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfProduct_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfProduct_List) ProtoMessage() {} + +func (x *ListOfProduct_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[143] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfProduct_List.ProtoReflect.Descriptor instead. +func (*ListOfProduct_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{11, 0} +} + +func (x *ListOfProduct_List) GetItems() []*Product { + if x != nil { + return x.Items + } + return nil +} + +type ListOfString_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []string `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfString_List) Reset() { + *x = ListOfString_List{} + mi := &file_product_proto_msgTypes[144] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfString_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfString_List) ProtoMessage() {} + +func (x *ListOfString_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[144] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfString_List.ProtoReflect.Descriptor instead. +func (*ListOfString_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{12, 0} +} + +func (x *ListOfString_List) GetItems() []string { + if x != nil { + return x.Items + } + return nil +} + +type ListOfUser_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*User `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfUser_List) Reset() { + *x = ListOfUser_List{} + mi := &file_product_proto_msgTypes[145] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfUser_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfUser_List) ProtoMessage() {} + +func (x *ListOfUser_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[145] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfUser_List.ProtoReflect.Descriptor instead. +func (*ListOfUser_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{13, 0} +} + +func (x *ListOfUser_List) GetItems() []*User { + if x != nil { + return x.Items + } + return nil +} + +type ListOfUserInput_List struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*UserInput `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOfUserInput_List) Reset() { + *x = ListOfUserInput_List{} + mi := &file_product_proto_msgTypes[146] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOfUserInput_List) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOfUserInput_List) ProtoMessage() {} + +func (x *ListOfUserInput_List) ProtoReflect() protoreflect.Message { + mi := &file_product_proto_msgTypes[146] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOfUserInput_List.ProtoReflect.Descriptor instead. +func (*ListOfUserInput_List) Descriptor() ([]byte, []int) { + return file_product_proto_rawDescGZIP(), []int{14, 0} +} + +func (x *ListOfUserInput_List) GetItems() []*UserInput { + if x != nil { + return x.Items + } + return nil +} + var File_product_proto protoreflect.FileDescriptor const file_product_proto_rawDesc = "" + "\n" + - "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\";\n" + - "\x0eListOfBlogPost\x12)\n" + - "\x05items\x18\x01 \x03(\v2\x13.productv1.BlogPostR\x05items\"%\n" + - "\rListOfBoolean\x12\x14\n" + - "\x05items\x18\x01 \x03(\bR\x05items\";\n" + - "\x0eListOfCategory\x12)\n" + - "\x05items\x18\x01 \x03(\v2\x13.productv1.CategoryR\x05items\"E\n" + - "\x13ListOfCategoryInput\x12.\n" + - "\x05items\x18\x01 \x03(\v2\x18.productv1.CategoryInputR\x05items\"#\n" + - "\vListOfFloat\x12\x14\n" + + "\rproduct.proto\x12\tproductv1\x1a\x1egoogle/protobuf/wrappers.proto\"w\n" + + "\x0eListOfBlogPost\x122\n" + + "\x04list\x18\x01 \x01(\v2\x1e.productv1.ListOfBlogPost.ListR\x04list\x1a1\n" + + "\x04List\x12)\n" + + "\x05items\x18\x01 \x03(\v2\x13.productv1.BlogPostR\x05items\"`\n" + + "\rListOfBoolean\x121\n" + + "\x04list\x18\x01 \x01(\v2\x1d.productv1.ListOfBoolean.ListR\x04list\x1a\x1c\n" + + "\x04List\x12\x14\n" + + "\x05items\x18\x01 \x03(\bR\x05items\"w\n" + + "\x0eListOfCategory\x122\n" + + "\x04list\x18\x01 \x01(\v2\x1e.productv1.ListOfCategory.ListR\x04list\x1a1\n" + + "\x04List\x12)\n" + + "\x05items\x18\x01 \x03(\v2\x13.productv1.CategoryR\x05items\"\x86\x01\n" + + "\x13ListOfCategoryInput\x127\n" + + "\x04list\x18\x01 \x01(\v2#.productv1.ListOfCategoryInput.ListR\x04list\x1a6\n" + + "\x04List\x12.\n" + + "\x05items\x18\x01 \x03(\v2\x18.productv1.CategoryInputR\x05items\"\\\n" + + "\vListOfFloat\x12/\n" + + "\x04list\x18\x01 \x01(\v2\x1b.productv1.ListOfFloat.ListR\x04list\x1a\x1c\n" + + "\x04List\x12\x14\n" + "\x05items\x18\x01 \x03(\x01R\x05items\"\x89\x01\n" + "\x14ListOfListOfCategory\x128\n" + "\x04list\x18\x01 \x01(\v2$.productv1.ListOfListOfCategory.ListR\x04list\x1a7\n" + @@ -7282,17 +7732,27 @@ const file_product_proto_rawDesc = "" + "\x15ListOfListOfUserInput\x129\n" + "\x04list\x18\x01 \x01(\v2%.productv1.ListOfListOfUserInput.ListR\x04list\x1a8\n" + "\x04List\x120\n" + - "\x05items\x18\x01 \x03(\v2\x1a.productv1.ListOfUserInputR\x05items\"=\n" + - "\x0fListOfOrderLine\x12*\n" + - "\x05items\x18\x01 \x03(\v2\x14.productv1.OrderLineR\x05items\"9\n" + - "\rListOfProduct\x12(\n" + - "\x05items\x18\x01 \x03(\v2\x12.productv1.ProductR\x05items\"$\n" + - "\fListOfString\x12\x14\n" + - "\x05items\x18\x01 \x03(\tR\x05items\"3\n" + + "\x05items\x18\x01 \x03(\v2\x1a.productv1.ListOfUserInputR\x05items\"z\n" + + "\x0fListOfOrderLine\x123\n" + + "\x04list\x18\x01 \x01(\v2\x1f.productv1.ListOfOrderLine.ListR\x04list\x1a2\n" + + "\x04List\x12*\n" + + "\x05items\x18\x01 \x03(\v2\x14.productv1.OrderLineR\x05items\"t\n" + + "\rListOfProduct\x121\n" + + "\x04list\x18\x01 \x01(\v2\x1d.productv1.ListOfProduct.ListR\x04list\x1a0\n" + + "\x04List\x12(\n" + + "\x05items\x18\x01 \x03(\v2\x12.productv1.ProductR\x05items\"^\n" + + "\fListOfString\x120\n" + + "\x04list\x18\x01 \x01(\v2\x1c.productv1.ListOfString.ListR\x04list\x1a\x1c\n" + + "\x04List\x12\x14\n" + + "\x05items\x18\x01 \x03(\tR\x05items\"k\n" + "\n" + - "ListOfUser\x12%\n" + - "\x05items\x18\x01 \x03(\v2\x0f.productv1.UserR\x05items\"=\n" + - "\x0fListOfUserInput\x12*\n" + + "ListOfUser\x12.\n" + + "\x04list\x18\x01 \x01(\v2\x1a.productv1.ListOfUser.ListR\x04list\x1a-\n" + + "\x04List\x12%\n" + + "\x05items\x18\x01 \x03(\v2\x0f.productv1.UserR\x05items\"z\n" + + "\x0fListOfUserInput\x123\n" + + "\x04list\x18\x01 \x01(\v2\x1f.productv1.ListOfUserInput.ListR\x04list\x1a2\n" + + "\x04List\x12*\n" + "\x05items\x18\x01 \x03(\v2\x14.productv1.UserInputR\x05items\"-\n" + "\x1bLookupProductByIdRequestKey\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\"V\n" + @@ -7740,7 +8200,7 @@ func file_product_proto_rawDescGZIP() []byte { } var file_product_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 137) +var file_product_proto_msgTypes = make([]protoimpl.MessageInfo, 147) var file_product_proto_goTypes = []any{ (CategoryKind)(0), // 0: productv1.CategoryKind (*ListOfBlogPost)(nil), // 1: productv1.ListOfBlogPost @@ -7875,254 +8335,274 @@ var file_product_proto_goTypes = []any{ (*ActionSuccess)(nil), // 130: productv1.ActionSuccess (*ActionError)(nil), // 131: productv1.ActionError (*CategoryInput)(nil), // 132: productv1.CategoryInput - (*ListOfListOfCategory_List)(nil), // 133: productv1.ListOfListOfCategory.List - (*ListOfListOfCategoryInput_List)(nil), // 134: productv1.ListOfListOfCategoryInput.List - (*ListOfListOfString_List)(nil), // 135: productv1.ListOfListOfString.List - (*ListOfListOfUser_List)(nil), // 136: productv1.ListOfListOfUser.List - (*ListOfListOfUserInput_List)(nil), // 137: productv1.ListOfListOfUserInput.List - (*wrapperspb.Int32Value)(nil), // 138: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 139: google.protobuf.StringValue - (*wrapperspb.DoubleValue)(nil), // 140: google.protobuf.DoubleValue - (*wrapperspb.BoolValue)(nil), // 141: google.protobuf.BoolValue + (*ListOfBlogPost_List)(nil), // 133: productv1.ListOfBlogPost.List + (*ListOfBoolean_List)(nil), // 134: productv1.ListOfBoolean.List + (*ListOfCategory_List)(nil), // 135: productv1.ListOfCategory.List + (*ListOfCategoryInput_List)(nil), // 136: productv1.ListOfCategoryInput.List + (*ListOfFloat_List)(nil), // 137: productv1.ListOfFloat.List + (*ListOfListOfCategory_List)(nil), // 138: productv1.ListOfListOfCategory.List + (*ListOfListOfCategoryInput_List)(nil), // 139: productv1.ListOfListOfCategoryInput.List + (*ListOfListOfString_List)(nil), // 140: productv1.ListOfListOfString.List + (*ListOfListOfUser_List)(nil), // 141: productv1.ListOfListOfUser.List + (*ListOfListOfUserInput_List)(nil), // 142: productv1.ListOfListOfUserInput.List + (*ListOfOrderLine_List)(nil), // 143: productv1.ListOfOrderLine.List + (*ListOfProduct_List)(nil), // 144: productv1.ListOfProduct.List + (*ListOfString_List)(nil), // 145: productv1.ListOfString.List + (*ListOfUser_List)(nil), // 146: productv1.ListOfUser.List + (*ListOfUserInput_List)(nil), // 147: productv1.ListOfUserInput.List + (*wrapperspb.Int32Value)(nil), // 148: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 149: google.protobuf.StringValue + (*wrapperspb.DoubleValue)(nil), // 150: google.protobuf.DoubleValue + (*wrapperspb.BoolValue)(nil), // 151: google.protobuf.BoolValue } var file_product_proto_depIdxs = []int32{ - 112, // 0: productv1.ListOfBlogPost.items:type_name -> productv1.BlogPost - 105, // 1: productv1.ListOfCategory.items:type_name -> productv1.Category - 132, // 2: productv1.ListOfCategoryInput.items:type_name -> productv1.CategoryInput - 133, // 3: productv1.ListOfListOfCategory.list:type_name -> productv1.ListOfListOfCategory.List - 134, // 4: productv1.ListOfListOfCategoryInput.list:type_name -> productv1.ListOfListOfCategoryInput.List - 135, // 5: productv1.ListOfListOfString.list:type_name -> productv1.ListOfListOfString.List - 136, // 6: productv1.ListOfListOfUser.list:type_name -> productv1.ListOfListOfUser.List - 137, // 7: productv1.ListOfListOfUserInput.list:type_name -> productv1.ListOfListOfUserInput.List - 127, // 8: productv1.ListOfOrderLine.items:type_name -> productv1.OrderLine - 94, // 9: productv1.ListOfProduct.items:type_name -> productv1.Product - 96, // 10: productv1.ListOfUser.items:type_name -> productv1.User - 116, // 11: productv1.ListOfUserInput.items:type_name -> productv1.UserInput - 16, // 12: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey - 94, // 13: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product - 19, // 14: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey - 95, // 15: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage - 96, // 16: productv1.QueryUsersResponse.users:type_name -> productv1.User - 96, // 17: productv1.QueryUserResponse.user:type_name -> productv1.User - 97, // 18: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA - 98, // 19: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType - 99, // 20: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields - 100, // 21: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput - 99, // 22: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields - 101, // 23: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput - 102, // 24: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput - 103, // 25: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput - 104, // 26: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order - 105, // 27: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category - 0, // 28: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind - 105, // 29: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category - 0, // 30: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind - 105, // 31: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category - 106, // 32: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter - 105, // 33: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category - 107, // 34: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal - 107, // 35: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal - 108, // 36: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput - 109, // 37: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult - 109, // 38: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult - 110, // 39: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType - 110, // 40: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType - 111, // 41: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter - 110, // 42: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType - 110, // 43: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType - 112, // 44: productv1.QueryBlogPostResponse.blog_post:type_name -> productv1.BlogPost - 112, // 45: productv1.QueryBlogPostByIdResponse.blog_post_by_id:type_name -> productv1.BlogPost - 113, // 46: productv1.QueryBlogPostsWithFilterRequest.filter:type_name -> productv1.BlogPostFilter - 112, // 47: productv1.QueryBlogPostsWithFilterResponse.blog_posts_with_filter:type_name -> productv1.BlogPost - 112, // 48: productv1.QueryAllBlogPostsResponse.all_blog_posts:type_name -> productv1.BlogPost - 114, // 49: productv1.QueryAuthorResponse.author:type_name -> productv1.Author - 114, // 50: productv1.QueryAuthorByIdResponse.author_by_id:type_name -> productv1.Author - 115, // 51: productv1.QueryAuthorsWithFilterRequest.filter:type_name -> productv1.AuthorFilter - 114, // 52: productv1.QueryAuthorsWithFilterResponse.authors_with_filter:type_name -> productv1.Author - 114, // 53: productv1.QueryAllAuthorsResponse.all_authors:type_name -> productv1.Author - 116, // 54: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput - 96, // 55: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User - 117, // 56: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput - 118, // 57: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult - 119, // 58: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 110, // 59: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType - 119, // 60: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput - 110, // 61: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType - 120, // 62: productv1.MutationCreateBlogPostRequest.input:type_name -> productv1.BlogPostInput - 112, // 63: productv1.MutationCreateBlogPostResponse.create_blog_post:type_name -> productv1.BlogPost - 120, // 64: productv1.MutationUpdateBlogPostRequest.input:type_name -> productv1.BlogPostInput - 112, // 65: productv1.MutationUpdateBlogPostResponse.update_blog_post:type_name -> productv1.BlogPost - 121, // 66: productv1.MutationCreateAuthorRequest.input:type_name -> productv1.AuthorInput - 114, // 67: productv1.MutationCreateAuthorResponse.create_author:type_name -> productv1.Author - 121, // 68: productv1.MutationUpdateAuthorRequest.input:type_name -> productv1.AuthorInput - 114, // 69: productv1.MutationUpdateAuthorResponse.update_author:type_name -> productv1.Author - 122, // 70: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB - 98, // 71: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType - 124, // 72: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType - 126, // 73: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput - 11, // 74: productv1.Order.order_lines:type_name -> productv1.ListOfOrderLine - 0, // 75: productv1.Category.kind:type_name -> productv1.CategoryKind - 0, // 76: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind - 125, // 77: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination - 128, // 78: productv1.Animal.cat:type_name -> productv1.Cat - 129, // 79: productv1.Animal.dog:type_name -> productv1.Dog - 138, // 80: productv1.SearchInput.limit:type_name -> google.protobuf.Int32Value - 94, // 81: productv1.SearchResult.product:type_name -> productv1.Product - 96, // 82: productv1.SearchResult.user:type_name -> productv1.User - 105, // 83: productv1.SearchResult.category:type_name -> productv1.Category - 139, // 84: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue - 138, // 85: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value - 140, // 86: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.DoubleValue - 141, // 87: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue - 139, // 88: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue - 139, // 89: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue - 141, // 90: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue - 13, // 91: productv1.BlogPost.optional_tags:type_name -> productv1.ListOfString - 13, // 92: productv1.BlogPost.keywords:type_name -> productv1.ListOfString - 5, // 93: productv1.BlogPost.ratings:type_name -> productv1.ListOfFloat - 2, // 94: productv1.BlogPost.is_published:type_name -> productv1.ListOfBoolean - 8, // 95: productv1.BlogPost.tag_groups:type_name -> productv1.ListOfListOfString - 8, // 96: productv1.BlogPost.related_topics:type_name -> productv1.ListOfListOfString - 8, // 97: productv1.BlogPost.comment_threads:type_name -> productv1.ListOfListOfString - 8, // 98: productv1.BlogPost.suggestions:type_name -> productv1.ListOfListOfString - 105, // 99: productv1.BlogPost.related_categories:type_name -> productv1.Category - 96, // 100: productv1.BlogPost.contributors:type_name -> productv1.User - 12, // 101: productv1.BlogPost.mentioned_products:type_name -> productv1.ListOfProduct - 14, // 102: productv1.BlogPost.mentioned_users:type_name -> productv1.ListOfUser - 6, // 103: productv1.BlogPost.category_groups:type_name -> productv1.ListOfListOfCategory - 9, // 104: productv1.BlogPost.contributor_teams:type_name -> productv1.ListOfListOfUser - 139, // 105: productv1.BlogPostFilter.title:type_name -> google.protobuf.StringValue - 141, // 106: productv1.BlogPostFilter.has_categories:type_name -> google.protobuf.BoolValue - 138, // 107: productv1.BlogPostFilter.min_tags:type_name -> google.protobuf.Int32Value - 139, // 108: productv1.Author.email:type_name -> google.protobuf.StringValue - 13, // 109: productv1.Author.social_links:type_name -> productv1.ListOfString - 8, // 110: productv1.Author.teams_by_project:type_name -> productv1.ListOfListOfString - 8, // 111: productv1.Author.collaborations:type_name -> productv1.ListOfListOfString - 1, // 112: productv1.Author.written_posts:type_name -> productv1.ListOfBlogPost - 105, // 113: productv1.Author.favorite_categories:type_name -> productv1.Category - 14, // 114: productv1.Author.related_authors:type_name -> productv1.ListOfUser - 12, // 115: productv1.Author.product_reviews:type_name -> productv1.ListOfProduct - 9, // 116: productv1.Author.author_groups:type_name -> productv1.ListOfListOfUser - 6, // 117: productv1.Author.category_preferences:type_name -> productv1.ListOfListOfCategory - 9, // 118: productv1.Author.project_teams:type_name -> productv1.ListOfListOfUser - 139, // 119: productv1.AuthorFilter.name:type_name -> google.protobuf.StringValue - 141, // 120: productv1.AuthorFilter.has_teams:type_name -> google.protobuf.BoolValue - 138, // 121: productv1.AuthorFilter.skill_count:type_name -> google.protobuf.Int32Value - 130, // 122: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess - 131, // 123: productv1.ActionResult.action_error:type_name -> productv1.ActionError - 139, // 124: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue - 138, // 125: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value - 140, // 126: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.DoubleValue - 141, // 127: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue - 13, // 128: productv1.BlogPostInput.optional_tags:type_name -> productv1.ListOfString - 13, // 129: productv1.BlogPostInput.keywords:type_name -> productv1.ListOfString - 5, // 130: productv1.BlogPostInput.ratings:type_name -> productv1.ListOfFloat - 2, // 131: productv1.BlogPostInput.is_published:type_name -> productv1.ListOfBoolean - 8, // 132: productv1.BlogPostInput.tag_groups:type_name -> productv1.ListOfListOfString - 8, // 133: productv1.BlogPostInput.related_topics:type_name -> productv1.ListOfListOfString - 8, // 134: productv1.BlogPostInput.comment_threads:type_name -> productv1.ListOfListOfString - 8, // 135: productv1.BlogPostInput.suggestions:type_name -> productv1.ListOfListOfString - 4, // 136: productv1.BlogPostInput.related_categories:type_name -> productv1.ListOfCategoryInput - 15, // 137: productv1.BlogPostInput.contributors:type_name -> productv1.ListOfUserInput - 7, // 138: productv1.BlogPostInput.category_groups:type_name -> productv1.ListOfListOfCategoryInput - 139, // 139: productv1.AuthorInput.email:type_name -> google.protobuf.StringValue - 13, // 140: productv1.AuthorInput.social_links:type_name -> productv1.ListOfString - 8, // 141: productv1.AuthorInput.teams_by_project:type_name -> productv1.ListOfListOfString - 8, // 142: productv1.AuthorInput.collaborations:type_name -> productv1.ListOfListOfString - 132, // 143: productv1.AuthorInput.favorite_categories:type_name -> productv1.CategoryInput - 10, // 144: productv1.AuthorInput.author_groups:type_name -> productv1.ListOfListOfUserInput - 10, // 145: productv1.AuthorInput.project_teams:type_name -> productv1.ListOfListOfUserInput - 123, // 146: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC - 125, // 147: productv1.FilterType.pagination:type_name -> productv1.Pagination - 13, // 148: productv1.OrderLineInput.modifiers:type_name -> productv1.ListOfString - 13, // 149: productv1.OrderLine.modifiers:type_name -> productv1.ListOfString - 0, // 150: productv1.CategoryInput.kind:type_name -> productv1.CategoryKind - 3, // 151: productv1.ListOfListOfCategory.List.items:type_name -> productv1.ListOfCategory - 4, // 152: productv1.ListOfListOfCategoryInput.List.items:type_name -> productv1.ListOfCategoryInput - 13, // 153: productv1.ListOfListOfString.List.items:type_name -> productv1.ListOfString - 14, // 154: productv1.ListOfListOfUser.List.items:type_name -> productv1.ListOfUser - 15, // 155: productv1.ListOfListOfUserInput.List.items:type_name -> productv1.ListOfUserInput - 17, // 156: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest - 20, // 157: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest - 90, // 158: productv1.ProductService.MutationCreateAuthor:input_type -> productv1.MutationCreateAuthorRequest - 86, // 159: productv1.ProductService.MutationCreateBlogPost:input_type -> productv1.MutationCreateBlogPostRequest - 82, // 160: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest - 78, // 161: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest - 80, // 162: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest - 92, // 163: productv1.ProductService.MutationUpdateAuthor:input_type -> productv1.MutationUpdateAuthorRequest - 88, // 164: productv1.ProductService.MutationUpdateBlogPost:input_type -> productv1.MutationUpdateBlogPostRequest - 84, // 165: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest - 76, // 166: productv1.ProductService.QueryAllAuthors:input_type -> productv1.QueryAllAuthorsRequest - 68, // 167: productv1.ProductService.QueryAllBlogPosts:input_type -> productv1.QueryAllBlogPostsRequest - 60, // 168: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest - 48, // 169: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest - 70, // 170: productv1.ProductService.QueryAuthor:input_type -> productv1.QueryAuthorRequest - 72, // 171: productv1.ProductService.QueryAuthorById:input_type -> productv1.QueryAuthorByIdRequest - 74, // 172: productv1.ProductService.QueryAuthorsWithFilter:input_type -> productv1.QueryAuthorsWithFilterRequest - 62, // 173: productv1.ProductService.QueryBlogPost:input_type -> productv1.QueryBlogPostRequest - 64, // 174: productv1.ProductService.QueryBlogPostById:input_type -> productv1.QueryBlogPostByIdRequest - 66, // 175: productv1.ProductService.QueryBlogPostsWithFilter:input_type -> productv1.QueryBlogPostsWithFilterRequest - 36, // 176: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest - 38, // 177: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest - 40, // 178: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest - 42, // 179: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest - 34, // 180: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest - 44, // 181: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest - 26, // 182: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest - 54, // 183: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest - 56, // 184: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest - 58, // 185: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest - 46, // 186: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest - 52, // 187: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest - 28, // 188: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest - 50, // 189: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest - 30, // 190: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest - 32, // 191: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest - 24, // 192: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest - 22, // 193: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest - 18, // 194: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse - 21, // 195: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse - 91, // 196: productv1.ProductService.MutationCreateAuthor:output_type -> productv1.MutationCreateAuthorResponse - 87, // 197: productv1.ProductService.MutationCreateBlogPost:output_type -> productv1.MutationCreateBlogPostResponse - 83, // 198: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse - 79, // 199: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse - 81, // 200: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse - 93, // 201: productv1.ProductService.MutationUpdateAuthor:output_type -> productv1.MutationUpdateAuthorResponse - 89, // 202: productv1.ProductService.MutationUpdateBlogPost:output_type -> productv1.MutationUpdateBlogPostResponse - 85, // 203: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse - 77, // 204: productv1.ProductService.QueryAllAuthors:output_type -> productv1.QueryAllAuthorsResponse - 69, // 205: productv1.ProductService.QueryAllBlogPosts:output_type -> productv1.QueryAllBlogPostsResponse - 61, // 206: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse - 49, // 207: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse - 71, // 208: productv1.ProductService.QueryAuthor:output_type -> productv1.QueryAuthorResponse - 73, // 209: productv1.ProductService.QueryAuthorById:output_type -> productv1.QueryAuthorByIdResponse - 75, // 210: productv1.ProductService.QueryAuthorsWithFilter:output_type -> productv1.QueryAuthorsWithFilterResponse - 63, // 211: productv1.ProductService.QueryBlogPost:output_type -> productv1.QueryBlogPostResponse - 65, // 212: productv1.ProductService.QueryBlogPostById:output_type -> productv1.QueryBlogPostByIdResponse - 67, // 213: productv1.ProductService.QueryBlogPostsWithFilter:output_type -> productv1.QueryBlogPostsWithFilterResponse - 37, // 214: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse - 39, // 215: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse - 41, // 216: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse - 43, // 217: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse - 35, // 218: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse - 45, // 219: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse - 27, // 220: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse - 55, // 221: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse - 57, // 222: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse - 59, // 223: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse - 47, // 224: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse - 53, // 225: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse - 29, // 226: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse - 51, // 227: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse - 31, // 228: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse - 33, // 229: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse - 25, // 230: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse - 23, // 231: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse - 194, // [194:232] is the sub-list for method output_type - 156, // [156:194] is the sub-list for method input_type - 156, // [156:156] is the sub-list for extension type_name - 156, // [156:156] is the sub-list for extension extendee - 0, // [0:156] is the sub-list for field type_name + 133, // 0: productv1.ListOfBlogPost.list:type_name -> productv1.ListOfBlogPost.List + 134, // 1: productv1.ListOfBoolean.list:type_name -> productv1.ListOfBoolean.List + 135, // 2: productv1.ListOfCategory.list:type_name -> productv1.ListOfCategory.List + 136, // 3: productv1.ListOfCategoryInput.list:type_name -> productv1.ListOfCategoryInput.List + 137, // 4: productv1.ListOfFloat.list:type_name -> productv1.ListOfFloat.List + 138, // 5: productv1.ListOfListOfCategory.list:type_name -> productv1.ListOfListOfCategory.List + 139, // 6: productv1.ListOfListOfCategoryInput.list:type_name -> productv1.ListOfListOfCategoryInput.List + 140, // 7: productv1.ListOfListOfString.list:type_name -> productv1.ListOfListOfString.List + 141, // 8: productv1.ListOfListOfUser.list:type_name -> productv1.ListOfListOfUser.List + 142, // 9: productv1.ListOfListOfUserInput.list:type_name -> productv1.ListOfListOfUserInput.List + 143, // 10: productv1.ListOfOrderLine.list:type_name -> productv1.ListOfOrderLine.List + 144, // 11: productv1.ListOfProduct.list:type_name -> productv1.ListOfProduct.List + 145, // 12: productv1.ListOfString.list:type_name -> productv1.ListOfString.List + 146, // 13: productv1.ListOfUser.list:type_name -> productv1.ListOfUser.List + 147, // 14: productv1.ListOfUserInput.list:type_name -> productv1.ListOfUserInput.List + 16, // 15: productv1.LookupProductByIdRequest.keys:type_name -> productv1.LookupProductByIdRequestKey + 94, // 16: productv1.LookupProductByIdResponse.result:type_name -> productv1.Product + 19, // 17: productv1.LookupStorageByIdRequest.keys:type_name -> productv1.LookupStorageByIdRequestKey + 95, // 18: productv1.LookupStorageByIdResponse.result:type_name -> productv1.Storage + 96, // 19: productv1.QueryUsersResponse.users:type_name -> productv1.User + 96, // 20: productv1.QueryUserResponse.user:type_name -> productv1.User + 97, // 21: productv1.QueryNestedTypeResponse.nested_type:type_name -> productv1.NestedTypeA + 98, // 22: productv1.QueryRecursiveTypeResponse.recursive_type:type_name -> productv1.RecursiveType + 99, // 23: productv1.QueryTypeFilterWithArgumentsResponse.type_filter_with_arguments:type_name -> productv1.TypeWithMultipleFilterFields + 100, // 24: productv1.QueryTypeWithMultipleFilterFieldsRequest.filter:type_name -> productv1.FilterTypeInput + 99, // 25: productv1.QueryTypeWithMultipleFilterFieldsResponse.type_with_multiple_filter_fields:type_name -> productv1.TypeWithMultipleFilterFields + 101, // 26: productv1.QueryComplexFilterTypeRequest.filter:type_name -> productv1.ComplexFilterTypeInput + 102, // 27: productv1.QueryComplexFilterTypeResponse.complex_filter_type:type_name -> productv1.TypeWithComplexFilterInput + 103, // 28: productv1.QueryCalculateTotalsRequest.orders:type_name -> productv1.OrderInput + 104, // 29: productv1.QueryCalculateTotalsResponse.calculate_totals:type_name -> productv1.Order + 105, // 30: productv1.QueryCategoriesResponse.categories:type_name -> productv1.Category + 0, // 31: productv1.QueryCategoriesByKindRequest.kind:type_name -> productv1.CategoryKind + 105, // 32: productv1.QueryCategoriesByKindResponse.categories_by_kind:type_name -> productv1.Category + 0, // 33: productv1.QueryCategoriesByKindsRequest.kinds:type_name -> productv1.CategoryKind + 105, // 34: productv1.QueryCategoriesByKindsResponse.categories_by_kinds:type_name -> productv1.Category + 106, // 35: productv1.QueryFilterCategoriesRequest.filter:type_name -> productv1.CategoryFilter + 105, // 36: productv1.QueryFilterCategoriesResponse.filter_categories:type_name -> productv1.Category + 107, // 37: productv1.QueryRandomPetResponse.random_pet:type_name -> productv1.Animal + 107, // 38: productv1.QueryAllPetsResponse.all_pets:type_name -> productv1.Animal + 108, // 39: productv1.QuerySearchRequest.input:type_name -> productv1.SearchInput + 109, // 40: productv1.QuerySearchResponse.search:type_name -> productv1.SearchResult + 109, // 41: productv1.QueryRandomSearchResultResponse.random_search_result:type_name -> productv1.SearchResult + 110, // 42: productv1.QueryNullableFieldsTypeResponse.nullable_fields_type:type_name -> productv1.NullableFieldsType + 110, // 43: productv1.QueryNullableFieldsTypeByIdResponse.nullable_fields_type_by_id:type_name -> productv1.NullableFieldsType + 111, // 44: productv1.QueryNullableFieldsTypeWithFilterRequest.filter:type_name -> productv1.NullableFieldsFilter + 110, // 45: productv1.QueryNullableFieldsTypeWithFilterResponse.nullable_fields_type_with_filter:type_name -> productv1.NullableFieldsType + 110, // 46: productv1.QueryAllNullableFieldsTypesResponse.all_nullable_fields_types:type_name -> productv1.NullableFieldsType + 112, // 47: productv1.QueryBlogPostResponse.blog_post:type_name -> productv1.BlogPost + 112, // 48: productv1.QueryBlogPostByIdResponse.blog_post_by_id:type_name -> productv1.BlogPost + 113, // 49: productv1.QueryBlogPostsWithFilterRequest.filter:type_name -> productv1.BlogPostFilter + 112, // 50: productv1.QueryBlogPostsWithFilterResponse.blog_posts_with_filter:type_name -> productv1.BlogPost + 112, // 51: productv1.QueryAllBlogPostsResponse.all_blog_posts:type_name -> productv1.BlogPost + 114, // 52: productv1.QueryAuthorResponse.author:type_name -> productv1.Author + 114, // 53: productv1.QueryAuthorByIdResponse.author_by_id:type_name -> productv1.Author + 115, // 54: productv1.QueryAuthorsWithFilterRequest.filter:type_name -> productv1.AuthorFilter + 114, // 55: productv1.QueryAuthorsWithFilterResponse.authors_with_filter:type_name -> productv1.Author + 114, // 56: productv1.QueryAllAuthorsResponse.all_authors:type_name -> productv1.Author + 116, // 57: productv1.MutationCreateUserRequest.input:type_name -> productv1.UserInput + 96, // 58: productv1.MutationCreateUserResponse.create_user:type_name -> productv1.User + 117, // 59: productv1.MutationPerformActionRequest.input:type_name -> productv1.ActionInput + 118, // 60: productv1.MutationPerformActionResponse.perform_action:type_name -> productv1.ActionResult + 119, // 61: productv1.MutationCreateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 110, // 62: productv1.MutationCreateNullableFieldsTypeResponse.create_nullable_fields_type:type_name -> productv1.NullableFieldsType + 119, // 63: productv1.MutationUpdateNullableFieldsTypeRequest.input:type_name -> productv1.NullableFieldsInput + 110, // 64: productv1.MutationUpdateNullableFieldsTypeResponse.update_nullable_fields_type:type_name -> productv1.NullableFieldsType + 120, // 65: productv1.MutationCreateBlogPostRequest.input:type_name -> productv1.BlogPostInput + 112, // 66: productv1.MutationCreateBlogPostResponse.create_blog_post:type_name -> productv1.BlogPost + 120, // 67: productv1.MutationUpdateBlogPostRequest.input:type_name -> productv1.BlogPostInput + 112, // 68: productv1.MutationUpdateBlogPostResponse.update_blog_post:type_name -> productv1.BlogPost + 121, // 69: productv1.MutationCreateAuthorRequest.input:type_name -> productv1.AuthorInput + 114, // 70: productv1.MutationCreateAuthorResponse.create_author:type_name -> productv1.Author + 121, // 71: productv1.MutationUpdateAuthorRequest.input:type_name -> productv1.AuthorInput + 114, // 72: productv1.MutationUpdateAuthorResponse.update_author:type_name -> productv1.Author + 122, // 73: productv1.NestedTypeA.b:type_name -> productv1.NestedTypeB + 98, // 74: productv1.RecursiveType.recursive_type:type_name -> productv1.RecursiveType + 124, // 75: productv1.ComplexFilterTypeInput.filter:type_name -> productv1.FilterType + 126, // 76: productv1.OrderInput.lines:type_name -> productv1.OrderLineInput + 11, // 77: productv1.Order.order_lines:type_name -> productv1.ListOfOrderLine + 0, // 78: productv1.Category.kind:type_name -> productv1.CategoryKind + 0, // 79: productv1.CategoryFilter.category:type_name -> productv1.CategoryKind + 125, // 80: productv1.CategoryFilter.pagination:type_name -> productv1.Pagination + 128, // 81: productv1.Animal.cat:type_name -> productv1.Cat + 129, // 82: productv1.Animal.dog:type_name -> productv1.Dog + 148, // 83: productv1.SearchInput.limit:type_name -> google.protobuf.Int32Value + 94, // 84: productv1.SearchResult.product:type_name -> productv1.Product + 96, // 85: productv1.SearchResult.user:type_name -> productv1.User + 105, // 86: productv1.SearchResult.category:type_name -> productv1.Category + 149, // 87: productv1.NullableFieldsType.optional_string:type_name -> google.protobuf.StringValue + 148, // 88: productv1.NullableFieldsType.optional_int:type_name -> google.protobuf.Int32Value + 150, // 89: productv1.NullableFieldsType.optional_float:type_name -> google.protobuf.DoubleValue + 151, // 90: productv1.NullableFieldsType.optional_boolean:type_name -> google.protobuf.BoolValue + 149, // 91: productv1.NullableFieldsFilter.name:type_name -> google.protobuf.StringValue + 149, // 92: productv1.NullableFieldsFilter.optional_string:type_name -> google.protobuf.StringValue + 151, // 93: productv1.NullableFieldsFilter.include_nulls:type_name -> google.protobuf.BoolValue + 13, // 94: productv1.BlogPost.optional_tags:type_name -> productv1.ListOfString + 13, // 95: productv1.BlogPost.keywords:type_name -> productv1.ListOfString + 5, // 96: productv1.BlogPost.ratings:type_name -> productv1.ListOfFloat + 2, // 97: productv1.BlogPost.is_published:type_name -> productv1.ListOfBoolean + 8, // 98: productv1.BlogPost.tag_groups:type_name -> productv1.ListOfListOfString + 8, // 99: productv1.BlogPost.related_topics:type_name -> productv1.ListOfListOfString + 8, // 100: productv1.BlogPost.comment_threads:type_name -> productv1.ListOfListOfString + 8, // 101: productv1.BlogPost.suggestions:type_name -> productv1.ListOfListOfString + 105, // 102: productv1.BlogPost.related_categories:type_name -> productv1.Category + 96, // 103: productv1.BlogPost.contributors:type_name -> productv1.User + 12, // 104: productv1.BlogPost.mentioned_products:type_name -> productv1.ListOfProduct + 14, // 105: productv1.BlogPost.mentioned_users:type_name -> productv1.ListOfUser + 6, // 106: productv1.BlogPost.category_groups:type_name -> productv1.ListOfListOfCategory + 9, // 107: productv1.BlogPost.contributor_teams:type_name -> productv1.ListOfListOfUser + 149, // 108: productv1.BlogPostFilter.title:type_name -> google.protobuf.StringValue + 151, // 109: productv1.BlogPostFilter.has_categories:type_name -> google.protobuf.BoolValue + 148, // 110: productv1.BlogPostFilter.min_tags:type_name -> google.protobuf.Int32Value + 149, // 111: productv1.Author.email:type_name -> google.protobuf.StringValue + 13, // 112: productv1.Author.social_links:type_name -> productv1.ListOfString + 8, // 113: productv1.Author.teams_by_project:type_name -> productv1.ListOfListOfString + 8, // 114: productv1.Author.collaborations:type_name -> productv1.ListOfListOfString + 1, // 115: productv1.Author.written_posts:type_name -> productv1.ListOfBlogPost + 105, // 116: productv1.Author.favorite_categories:type_name -> productv1.Category + 14, // 117: productv1.Author.related_authors:type_name -> productv1.ListOfUser + 12, // 118: productv1.Author.product_reviews:type_name -> productv1.ListOfProduct + 9, // 119: productv1.Author.author_groups:type_name -> productv1.ListOfListOfUser + 6, // 120: productv1.Author.category_preferences:type_name -> productv1.ListOfListOfCategory + 9, // 121: productv1.Author.project_teams:type_name -> productv1.ListOfListOfUser + 149, // 122: productv1.AuthorFilter.name:type_name -> google.protobuf.StringValue + 151, // 123: productv1.AuthorFilter.has_teams:type_name -> google.protobuf.BoolValue + 148, // 124: productv1.AuthorFilter.skill_count:type_name -> google.protobuf.Int32Value + 130, // 125: productv1.ActionResult.action_success:type_name -> productv1.ActionSuccess + 131, // 126: productv1.ActionResult.action_error:type_name -> productv1.ActionError + 149, // 127: productv1.NullableFieldsInput.optional_string:type_name -> google.protobuf.StringValue + 148, // 128: productv1.NullableFieldsInput.optional_int:type_name -> google.protobuf.Int32Value + 150, // 129: productv1.NullableFieldsInput.optional_float:type_name -> google.protobuf.DoubleValue + 151, // 130: productv1.NullableFieldsInput.optional_boolean:type_name -> google.protobuf.BoolValue + 13, // 131: productv1.BlogPostInput.optional_tags:type_name -> productv1.ListOfString + 13, // 132: productv1.BlogPostInput.keywords:type_name -> productv1.ListOfString + 5, // 133: productv1.BlogPostInput.ratings:type_name -> productv1.ListOfFloat + 2, // 134: productv1.BlogPostInput.is_published:type_name -> productv1.ListOfBoolean + 8, // 135: productv1.BlogPostInput.tag_groups:type_name -> productv1.ListOfListOfString + 8, // 136: productv1.BlogPostInput.related_topics:type_name -> productv1.ListOfListOfString + 8, // 137: productv1.BlogPostInput.comment_threads:type_name -> productv1.ListOfListOfString + 8, // 138: productv1.BlogPostInput.suggestions:type_name -> productv1.ListOfListOfString + 4, // 139: productv1.BlogPostInput.related_categories:type_name -> productv1.ListOfCategoryInput + 15, // 140: productv1.BlogPostInput.contributors:type_name -> productv1.ListOfUserInput + 7, // 141: productv1.BlogPostInput.category_groups:type_name -> productv1.ListOfListOfCategoryInput + 149, // 142: productv1.AuthorInput.email:type_name -> google.protobuf.StringValue + 13, // 143: productv1.AuthorInput.social_links:type_name -> productv1.ListOfString + 8, // 144: productv1.AuthorInput.teams_by_project:type_name -> productv1.ListOfListOfString + 8, // 145: productv1.AuthorInput.collaborations:type_name -> productv1.ListOfListOfString + 132, // 146: productv1.AuthorInput.favorite_categories:type_name -> productv1.CategoryInput + 10, // 147: productv1.AuthorInput.author_groups:type_name -> productv1.ListOfListOfUserInput + 10, // 148: productv1.AuthorInput.project_teams:type_name -> productv1.ListOfListOfUserInput + 123, // 149: productv1.NestedTypeB.c:type_name -> productv1.NestedTypeC + 125, // 150: productv1.FilterType.pagination:type_name -> productv1.Pagination + 13, // 151: productv1.OrderLineInput.modifiers:type_name -> productv1.ListOfString + 13, // 152: productv1.OrderLine.modifiers:type_name -> productv1.ListOfString + 0, // 153: productv1.CategoryInput.kind:type_name -> productv1.CategoryKind + 112, // 154: productv1.ListOfBlogPost.List.items:type_name -> productv1.BlogPost + 105, // 155: productv1.ListOfCategory.List.items:type_name -> productv1.Category + 132, // 156: productv1.ListOfCategoryInput.List.items:type_name -> productv1.CategoryInput + 3, // 157: productv1.ListOfListOfCategory.List.items:type_name -> productv1.ListOfCategory + 4, // 158: productv1.ListOfListOfCategoryInput.List.items:type_name -> productv1.ListOfCategoryInput + 13, // 159: productv1.ListOfListOfString.List.items:type_name -> productv1.ListOfString + 14, // 160: productv1.ListOfListOfUser.List.items:type_name -> productv1.ListOfUser + 15, // 161: productv1.ListOfListOfUserInput.List.items:type_name -> productv1.ListOfUserInput + 127, // 162: productv1.ListOfOrderLine.List.items:type_name -> productv1.OrderLine + 94, // 163: productv1.ListOfProduct.List.items:type_name -> productv1.Product + 96, // 164: productv1.ListOfUser.List.items:type_name -> productv1.User + 116, // 165: productv1.ListOfUserInput.List.items:type_name -> productv1.UserInput + 17, // 166: productv1.ProductService.LookupProductById:input_type -> productv1.LookupProductByIdRequest + 20, // 167: productv1.ProductService.LookupStorageById:input_type -> productv1.LookupStorageByIdRequest + 90, // 168: productv1.ProductService.MutationCreateAuthor:input_type -> productv1.MutationCreateAuthorRequest + 86, // 169: productv1.ProductService.MutationCreateBlogPost:input_type -> productv1.MutationCreateBlogPostRequest + 82, // 170: productv1.ProductService.MutationCreateNullableFieldsType:input_type -> productv1.MutationCreateNullableFieldsTypeRequest + 78, // 171: productv1.ProductService.MutationCreateUser:input_type -> productv1.MutationCreateUserRequest + 80, // 172: productv1.ProductService.MutationPerformAction:input_type -> productv1.MutationPerformActionRequest + 92, // 173: productv1.ProductService.MutationUpdateAuthor:input_type -> productv1.MutationUpdateAuthorRequest + 88, // 174: productv1.ProductService.MutationUpdateBlogPost:input_type -> productv1.MutationUpdateBlogPostRequest + 84, // 175: productv1.ProductService.MutationUpdateNullableFieldsType:input_type -> productv1.MutationUpdateNullableFieldsTypeRequest + 76, // 176: productv1.ProductService.QueryAllAuthors:input_type -> productv1.QueryAllAuthorsRequest + 68, // 177: productv1.ProductService.QueryAllBlogPosts:input_type -> productv1.QueryAllBlogPostsRequest + 60, // 178: productv1.ProductService.QueryAllNullableFieldsTypes:input_type -> productv1.QueryAllNullableFieldsTypesRequest + 48, // 179: productv1.ProductService.QueryAllPets:input_type -> productv1.QueryAllPetsRequest + 70, // 180: productv1.ProductService.QueryAuthor:input_type -> productv1.QueryAuthorRequest + 72, // 181: productv1.ProductService.QueryAuthorById:input_type -> productv1.QueryAuthorByIdRequest + 74, // 182: productv1.ProductService.QueryAuthorsWithFilter:input_type -> productv1.QueryAuthorsWithFilterRequest + 62, // 183: productv1.ProductService.QueryBlogPost:input_type -> productv1.QueryBlogPostRequest + 64, // 184: productv1.ProductService.QueryBlogPostById:input_type -> productv1.QueryBlogPostByIdRequest + 66, // 185: productv1.ProductService.QueryBlogPostsWithFilter:input_type -> productv1.QueryBlogPostsWithFilterRequest + 36, // 186: productv1.ProductService.QueryCalculateTotals:input_type -> productv1.QueryCalculateTotalsRequest + 38, // 187: productv1.ProductService.QueryCategories:input_type -> productv1.QueryCategoriesRequest + 40, // 188: productv1.ProductService.QueryCategoriesByKind:input_type -> productv1.QueryCategoriesByKindRequest + 42, // 189: productv1.ProductService.QueryCategoriesByKinds:input_type -> productv1.QueryCategoriesByKindsRequest + 34, // 190: productv1.ProductService.QueryComplexFilterType:input_type -> productv1.QueryComplexFilterTypeRequest + 44, // 191: productv1.ProductService.QueryFilterCategories:input_type -> productv1.QueryFilterCategoriesRequest + 26, // 192: productv1.ProductService.QueryNestedType:input_type -> productv1.QueryNestedTypeRequest + 54, // 193: productv1.ProductService.QueryNullableFieldsType:input_type -> productv1.QueryNullableFieldsTypeRequest + 56, // 194: productv1.ProductService.QueryNullableFieldsTypeById:input_type -> productv1.QueryNullableFieldsTypeByIdRequest + 58, // 195: productv1.ProductService.QueryNullableFieldsTypeWithFilter:input_type -> productv1.QueryNullableFieldsTypeWithFilterRequest + 46, // 196: productv1.ProductService.QueryRandomPet:input_type -> productv1.QueryRandomPetRequest + 52, // 197: productv1.ProductService.QueryRandomSearchResult:input_type -> productv1.QueryRandomSearchResultRequest + 28, // 198: productv1.ProductService.QueryRecursiveType:input_type -> productv1.QueryRecursiveTypeRequest + 50, // 199: productv1.ProductService.QuerySearch:input_type -> productv1.QuerySearchRequest + 30, // 200: productv1.ProductService.QueryTypeFilterWithArguments:input_type -> productv1.QueryTypeFilterWithArgumentsRequest + 32, // 201: productv1.ProductService.QueryTypeWithMultipleFilterFields:input_type -> productv1.QueryTypeWithMultipleFilterFieldsRequest + 24, // 202: productv1.ProductService.QueryUser:input_type -> productv1.QueryUserRequest + 22, // 203: productv1.ProductService.QueryUsers:input_type -> productv1.QueryUsersRequest + 18, // 204: productv1.ProductService.LookupProductById:output_type -> productv1.LookupProductByIdResponse + 21, // 205: productv1.ProductService.LookupStorageById:output_type -> productv1.LookupStorageByIdResponse + 91, // 206: productv1.ProductService.MutationCreateAuthor:output_type -> productv1.MutationCreateAuthorResponse + 87, // 207: productv1.ProductService.MutationCreateBlogPost:output_type -> productv1.MutationCreateBlogPostResponse + 83, // 208: productv1.ProductService.MutationCreateNullableFieldsType:output_type -> productv1.MutationCreateNullableFieldsTypeResponse + 79, // 209: productv1.ProductService.MutationCreateUser:output_type -> productv1.MutationCreateUserResponse + 81, // 210: productv1.ProductService.MutationPerformAction:output_type -> productv1.MutationPerformActionResponse + 93, // 211: productv1.ProductService.MutationUpdateAuthor:output_type -> productv1.MutationUpdateAuthorResponse + 89, // 212: productv1.ProductService.MutationUpdateBlogPost:output_type -> productv1.MutationUpdateBlogPostResponse + 85, // 213: productv1.ProductService.MutationUpdateNullableFieldsType:output_type -> productv1.MutationUpdateNullableFieldsTypeResponse + 77, // 214: productv1.ProductService.QueryAllAuthors:output_type -> productv1.QueryAllAuthorsResponse + 69, // 215: productv1.ProductService.QueryAllBlogPosts:output_type -> productv1.QueryAllBlogPostsResponse + 61, // 216: productv1.ProductService.QueryAllNullableFieldsTypes:output_type -> productv1.QueryAllNullableFieldsTypesResponse + 49, // 217: productv1.ProductService.QueryAllPets:output_type -> productv1.QueryAllPetsResponse + 71, // 218: productv1.ProductService.QueryAuthor:output_type -> productv1.QueryAuthorResponse + 73, // 219: productv1.ProductService.QueryAuthorById:output_type -> productv1.QueryAuthorByIdResponse + 75, // 220: productv1.ProductService.QueryAuthorsWithFilter:output_type -> productv1.QueryAuthorsWithFilterResponse + 63, // 221: productv1.ProductService.QueryBlogPost:output_type -> productv1.QueryBlogPostResponse + 65, // 222: productv1.ProductService.QueryBlogPostById:output_type -> productv1.QueryBlogPostByIdResponse + 67, // 223: productv1.ProductService.QueryBlogPostsWithFilter:output_type -> productv1.QueryBlogPostsWithFilterResponse + 37, // 224: productv1.ProductService.QueryCalculateTotals:output_type -> productv1.QueryCalculateTotalsResponse + 39, // 225: productv1.ProductService.QueryCategories:output_type -> productv1.QueryCategoriesResponse + 41, // 226: productv1.ProductService.QueryCategoriesByKind:output_type -> productv1.QueryCategoriesByKindResponse + 43, // 227: productv1.ProductService.QueryCategoriesByKinds:output_type -> productv1.QueryCategoriesByKindsResponse + 35, // 228: productv1.ProductService.QueryComplexFilterType:output_type -> productv1.QueryComplexFilterTypeResponse + 45, // 229: productv1.ProductService.QueryFilterCategories:output_type -> productv1.QueryFilterCategoriesResponse + 27, // 230: productv1.ProductService.QueryNestedType:output_type -> productv1.QueryNestedTypeResponse + 55, // 231: productv1.ProductService.QueryNullableFieldsType:output_type -> productv1.QueryNullableFieldsTypeResponse + 57, // 232: productv1.ProductService.QueryNullableFieldsTypeById:output_type -> productv1.QueryNullableFieldsTypeByIdResponse + 59, // 233: productv1.ProductService.QueryNullableFieldsTypeWithFilter:output_type -> productv1.QueryNullableFieldsTypeWithFilterResponse + 47, // 234: productv1.ProductService.QueryRandomPet:output_type -> productv1.QueryRandomPetResponse + 53, // 235: productv1.ProductService.QueryRandomSearchResult:output_type -> productv1.QueryRandomSearchResultResponse + 29, // 236: productv1.ProductService.QueryRecursiveType:output_type -> productv1.QueryRecursiveTypeResponse + 51, // 237: productv1.ProductService.QuerySearch:output_type -> productv1.QuerySearchResponse + 31, // 238: productv1.ProductService.QueryTypeFilterWithArguments:output_type -> productv1.QueryTypeFilterWithArgumentsResponse + 33, // 239: productv1.ProductService.QueryTypeWithMultipleFilterFields:output_type -> productv1.QueryTypeWithMultipleFilterFieldsResponse + 25, // 240: productv1.ProductService.QueryUser:output_type -> productv1.QueryUserResponse + 23, // 241: productv1.ProductService.QueryUsers:output_type -> productv1.QueryUsersResponse + 204, // [204:242] is the sub-list for method output_type + 166, // [166:204] is the sub-list for method input_type + 166, // [166:166] is the sub-list for extension type_name + 166, // [166:166] is the sub-list for extension extendee + 0, // [0:166] is the sub-list for field type_name } func init() { file_product_proto_init() } @@ -8149,7 +8629,7 @@ func file_product_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_product_proto_rawDesc), len(file_product_proto_rawDesc)), NumEnums: 1, - NumMessages: 137, + NumMessages: 147, NumExtensions: 0, NumServices: 1, }, From 7d4a0138d7e2e7d3dcc64122975d58ac420e733a Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 28 Jul 2025 09:20:38 +0200 Subject: [PATCH 11/16] chore: improve mockservice --- v2/pkg/grpctest/mockservice.go | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/v2/pkg/grpctest/mockservice.go b/v2/pkg/grpctest/mockservice.go index 5ed322a21b..c057905efb 100644 --- a/v2/pkg/grpctest/mockservice.go +++ b/v2/pkg/grpctest/mockservice.go @@ -2042,6 +2042,35 @@ func (s *MockService) MutationUpdateBlogPost(ctx context.Context, in *productv1. RelatedTopics: input.GetRelatedTopics(), CommentThreads: input.GetCommentThreads(), Suggestions: input.GetSuggestions(), + // Convert input types to output types + RelatedCategories: convertCategoryInputListToCategories(input.GetRelatedCategories()), + Contributors: convertUserInputsToUsers(input.GetContributors()), + CategoryGroups: convertNestedCategoryInputsToCategories(input.GetCategoryGroups()), + MentionedProducts: &productv1.ListOfProduct{ + List: &productv1.ListOfProduct_List{ + Items: []*productv1.Product{ + {Id: "prod-updated", Name: "Updated Product", Price: 149.99}, + }, + }, + }, + MentionedUsers: &productv1.ListOfUser{ + List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "user-updated", Name: "Updated User"}, + }, + }, + }, + ContributorTeams: &productv1.ListOfListOfUser{ + List: &productv1.ListOfListOfUser_List{ + Items: []*productv1.ListOfUser{ + {List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "user-team-updated", Name: "Updated Team Member"}, + }, + }}, + }, + }, + }, } return &productv1.MutationUpdateBlogPostResponse{ @@ -2125,6 +2154,43 @@ func (s *MockService) MutationUpdateAuthor(ctx context.Context, in *productv1.Mu SocialLinks: input.GetSocialLinks(), TeamsByProject: input.GetTeamsByProject(), Collaborations: input.GetCollaborations(), + // Convert input types to output types for complex fields + FavoriteCategories: convertCategoryInputsToCategories(input.GetFavoriteCategories()), + AuthorGroups: convertNestedUserInputsToUsers(input.GetAuthorGroups()), + ProjectTeams: convertNestedUserInputsToUsers(input.GetProjectTeams()), + // Keep other complex fields with mock data since they're not in the simplified input + WrittenPosts: &productv1.ListOfBlogPost{ + List: &productv1.ListOfBlogPost_List{ + Items: []*productv1.BlogPost{ + {Id: "blog-updated", Title: "Updated Post", Content: "Updated content..."}, + }, + }, + }, + RelatedAuthors: &productv1.ListOfUser{ + List: &productv1.ListOfUser_List{ + Items: []*productv1.User{ + {Id: "related-author-updated", Name: "Updated Related Author"}, + }, + }, + }, + ProductReviews: &productv1.ListOfProduct{ + List: &productv1.ListOfProduct_List{ + Items: []*productv1.Product{ + {Id: "reviewed-product-updated", Name: "Updated Code Editor", Price: 249.99}, + }, + }, + }, + CategoryPreferences: &productv1.ListOfListOfCategory{ + List: &productv1.ListOfListOfCategory_List{ + Items: []*productv1.ListOfCategory{ + {List: &productv1.ListOfCategory_List{ + Items: []*productv1.Category{ + {Id: "pref-cat-updated", Name: "Updated Backend Development", Kind: productv1.CategoryKind_CATEGORY_KIND_ELECTRONICS}, + }, + }}, + }, + }, + }, } return &productv1.MutationUpdateAuthorResponse{ From c0b4e880b92f6e78c2a47db1164a032226416b5d Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 28 Jul 2025 13:43:53 +0200 Subject: [PATCH 12/16] chore: address PR comments --- .../engine/execution_engine_grpc_test.go | 12 ++----- v2/pkg/ast/ast_type.go | 10 ++++++ .../datasource/grpc_datasource/compiler.go | 31 +++++++++++++++++-- .../grpc_datasource/execution_plan_visitor.go | 8 ++--- 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/execution/engine/execution_engine_grpc_test.go b/execution/engine/execution_engine_grpc_test.go index 37cbd0f5c9..632924fa4d 100644 --- a/execution/engine/execution_engine_grpc_test.go +++ b/execution/engine/execution_engine_grpc_test.go @@ -860,12 +860,7 @@ func TestGRPCSubgraphExecution(t *testing.T) { response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) require.NoError(t, err) - require.Contains(t, response, `"tagGroups":`) - require.Contains(t, response, `"relatedTopics":`) - require.Contains(t, response, `"commentThreads":`) - require.Contains(t, response, `"suggestions":`) - // Verify nested structure with arrays of arrays - require.Contains(t, response, `[[`) + require.Equal(t, `{"data":{"blogPost":{"id":"blog-default","title":"Default Blog Post","tagGroups":[["tech","programming"],["golang","backend"]],"relatedTopics":[["microservices","api"],["databases","performance"]],"commentThreads":[["Great post!","Very helpful"],["Could use more examples","Thanks for sharing"]],"suggestions":[["Add code examples","Include diagrams"]]}}}`, response) }) t.Run("should handle BlogPost query with complex lists", func(t *testing.T) { @@ -1045,10 +1040,7 @@ func TestGRPCSubgraphExecution(t *testing.T) { response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) require.NoError(t, err) - require.Contains(t, response, `"teamsByProject":`) - require.Contains(t, response, `"collaborations":`) - // Verify nested structure - require.Contains(t, response, `[[`) + require.Equal(t, `{"data":{"author":{"id":"author-default","name":"Default Author","teamsByProject":[["Alice","Bob","Charlie"],["David","Eve"]],"collaborations":[["Open Source Project A","Research Paper B"],["Conference Talk C"]]}}}`, response) }) t.Run("should handle Author query with complex lists", func(t *testing.T) { diff --git a/v2/pkg/ast/ast_type.go b/v2/pkg/ast/ast_type.go index 001cd36547..f029800629 100644 --- a/v2/pkg/ast/ast_type.go +++ b/v2/pkg/ast/ast_type.go @@ -180,6 +180,16 @@ func (d *Document) TypeIsList(ref int) bool { } } +// TypeIsNonNullList checks if the type is a non-nullable list. +// e.g.: +// * [String!]! -> true +// * [String!] -> false +// * [String] -> false +// * [String]! -> true +func (d *Document) TypeIsNonNullList(ref int) bool { + return d.Types[ref].TypeKind == TypeKindNonNull && d.TypeIsList(d.Types[ref].OfType) +} + func (d *Document) TypeNumberOfListWraps(ref int) int { count := 0 for { diff --git a/v2/pkg/engine/datasource/grpc_datasource/compiler.go b/v2/pkg/engine/datasource/grpc_datasource/compiler.go index c378355b81..ee49e8176c 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/compiler.go +++ b/v2/pkg/engine/datasource/grpc_datasource/compiler.go @@ -212,6 +212,8 @@ func (d *Document) ServiceByRef(ref int) Service { // MessageByName returns a Message by its name. // Returns an empty Message if no message with the given name exists. +// We only expect this function to return false if either the message name was provided incorrectly, +// or the schema and mapping was not properly configured. func (d *Document) MessageByName(name string) (Message, bool) { for _, m := range d.Messages { if m.Name == name { @@ -446,9 +448,15 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes var fieldMsg *dynamicpb.Message switch { + case rpcField.IsListType: - // nested and nullable lists are wrapped in a message, therefore we need to handle them differently - // than repeated fields. + // Nested and nullable lists are wrapped in a message, therefore we need to handle them differently + // than repeated fields. We need to do this because protobuf repeated fields are not nullable and cannot be nested. + // + // message BlogPost { + // ListOfBoolean is_published = 1; + // ListOfListOfString related_topics = 2; + // } if !data.Get(rpcField.JSONPath).Exists() { if !rpcField.Optional { p.report.AddInternalError(fmt.Errorf("field %s is required but has no value", rpcField.JSONPath)) @@ -508,12 +516,31 @@ func (p *RPCCompiler) buildProtoMessage(inputMessage Message, rpcMessage *RPCMes return message } +// buildListMessage creates a new protobuf message, which reflects a wrapper type to work with a list in GraphQL. +// A list wrapper type has an inner message type, which contains a repeated field. +// We need this to make sure we can differentiate between a null list and an empty list, as repeated fields are not nullable. +// +// message ListOfFloat { +// message List { +// repeated double items = 1; +// } +// List list = 1; +// } func (p *RPCCompiler) buildListMessage(desc protoref.MessageDescriptor, field Field, rpcField *RPCField, data gjson.Result) *dynamicpb.Message { rootMsg := dynamicpb.NewMessage(desc.Fields().ByName(protoref.Name(field.Name)).Message()) p.traverseList(rootMsg, 1, field, rpcField, data.Get(rpcField.JSONPath)) return rootMsg } +// traverseList makes sure we can handle nested lists properly. +// A nested list follows the same structure as a regular list, but references the lower nested message list wrapper. +// +// message ListOfListOfString { +// message List { +// repeated ListOfString items = 1; +// } +// List list = 1; +// } func (p *RPCCompiler) traverseList(rootMsg protoref.Message, level int, field Field, rpcField *RPCField, data gjson.Result) protoref.Message { listFieldDesc := rootMsg.Descriptor().Fields().ByNumber(1) if listFieldDesc == nil { diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go index 5de85540a8..83f6850641 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go @@ -454,7 +454,7 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i TypeName: DataTypeMessage.String(), JSONPath: jsonPath, Message: msg, - Repeated: r.typeIsNonNullList(typeRef), + Repeated: r.definition.TypeIsNonNullList(typeRef), }) // Add the current request message to the ancestors and set the current request message to the new message. @@ -475,7 +475,7 @@ func (r *rpcPlanVisitor) enrichRequestMessageFromInputArgument(argRef, typeRef i Name: r.resolveInputArgument(baseType, r.walker.Ancestor().Ref, fieldName), TypeName: dt.String(), JSONPath: jsonPath, - Repeated: r.typeIsNonNullList(typeRef), + Repeated: r.definition.TypeIsNonNullList(typeRef), Optional: !r.definition.TypeIsNonNull(typeRef), } @@ -583,10 +583,6 @@ func (r *rpcPlanVisitor) buildInputMessageField(typeRef int, fieldName, jsonPath return field } -func (r *rpcPlanVisitor) typeIsNonNullList(typeRef int) bool { - return r.definition.TypeIsList(typeRef) && r.definition.TypeIsNonNull(typeRef) -} - func (r *rpcPlanVisitor) createListMetadata(typeRef int) *ListMetadata { nestingLevel := r.definition.TypeNumberOfListWraps(typeRef) From e7eb675f8802e4fcfcd9e649be4475a68468cfa0 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 28 Jul 2025 13:46:40 +0200 Subject: [PATCH 13/16] chore: update comment --- v2/pkg/ast/ast_type.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2/pkg/ast/ast_type.go b/v2/pkg/ast/ast_type.go index f029800629..4ff4b38174 100644 --- a/v2/pkg/ast/ast_type.go +++ b/v2/pkg/ast/ast_type.go @@ -183,9 +183,9 @@ func (d *Document) TypeIsList(ref int) bool { // TypeIsNonNullList checks if the type is a non-nullable list. // e.g.: // * [String!]! -> true +// * [String]! -> true // * [String!] -> false // * [String] -> false -// * [String]! -> true func (d *Document) TypeIsNonNullList(ref int) bool { return d.Types[ref].TypeKind == TypeKindNonNull && d.TypeIsList(d.Types[ref].OfType) } From 559479c009158368d1af912d22da5f31fe8823f0 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 28 Jul 2025 14:15:18 +0200 Subject: [PATCH 14/16] chore: use max values for testing --- execution/engine/execution_engine_grpc_test.go | 11 ++++++----- v2/pkg/grpctest/mockservice.go | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/execution/engine/execution_engine_grpc_test.go b/execution/engine/execution_engine_grpc_test.go index 632924fa4d..94bf2f3f6b 100644 --- a/execution/engine/execution_engine_grpc_test.go +++ b/execution/engine/execution_engine_grpc_test.go @@ -6,6 +6,7 @@ package engine import ( "context" "fmt" + "math" "os" "os/exec" "path/filepath" @@ -631,7 +632,7 @@ func TestGRPCSubgraphExecution(t *testing.T) { response, err := executeOperation(t, conn, operation, withGRPCMapping(mapping.DefaultGRPCMapping())) require.NoError(t, err) - require.Equal(t, `{"data":{"allNullableFieldsTypes":[{"id":"nullable-1","name":"Full Data Entry","optionalString":"Optional String Value","optionalInt":42,"optionalFloat":3.14,"optionalBoolean":true,"requiredString":"Required String 1","requiredInt":100},{"id":"nullable-2","name":"Partial Data Entry","optionalString":"Only string is set","optionalInt":null,"optionalFloat":null,"optionalBoolean":false,"requiredString":"Required String 2","requiredInt":200},{"id":"nullable-3","name":"Minimal Data Entry","optionalString":null,"optionalInt":null,"optionalFloat":null,"optionalBoolean":null,"requiredString":"Required String 3","requiredInt":300}]}}`, response) + require.Equal(t, `{"data":{"allNullableFieldsTypes":[{"id":"nullable-1","name":"Full Data Entry","optionalString":"Optional String Value","optionalInt":42,"optionalFloat":1.7976931348623157e+308,"optionalBoolean":true,"requiredString":"Required String 1","requiredInt":100},{"id":"nullable-2","name":"Partial Data Entry","optionalString":"Only string is set","optionalInt":null,"optionalFloat":null,"optionalBoolean":false,"requiredString":"Required String 2","requiredInt":200},{"id":"nullable-3","name":"Minimal Data Entry","optionalString":null,"optionalInt":null,"optionalFloat":null,"optionalBoolean":null,"requiredString":"Required String 3","requiredInt":300}]}}`, response) }) t.Run("should handle nullable fields query with filter", func(t *testing.T) { @@ -677,8 +678,8 @@ func TestGRPCSubgraphExecution(t *testing.T) { "input": map[string]any{ "name": "Created Type", "optionalString": "Optional Value", - "optionalInt": 42, - "optionalFloat": 3.14, + "optionalInt": math.MaxInt32, + "optionalFloat": math.MaxFloat64, "optionalBoolean": true, "requiredString": "Required Value", "requiredInt": 100, @@ -703,8 +704,8 @@ func TestGRPCSubgraphExecution(t *testing.T) { require.NoError(t, err) require.Contains(t, response, `"name":"Created Type"`) require.Contains(t, response, `"optionalString":"Optional Value"`) - require.Contains(t, response, `"optionalInt":42`) - require.Contains(t, response, `"optionalFloat":3.14`) + require.Contains(t, response, `"optionalInt":2147483647`) + require.Contains(t, response, `"optionalFloat":1.7976931348623157e+308`) require.Contains(t, response, `"optionalBoolean":true`) require.Contains(t, response, `"requiredString":"Required Value"`) require.Contains(t, response, `"requiredInt":100`) diff --git a/v2/pkg/grpctest/mockservice.go b/v2/pkg/grpctest/mockservice.go index c057905efb..54f4283f4a 100644 --- a/v2/pkg/grpctest/mockservice.go +++ b/v2/pkg/grpctest/mockservice.go @@ -3,6 +3,7 @@ package grpctest import ( context "context" "fmt" + "math" "math/rand" "strconv" @@ -210,7 +211,7 @@ func (s *MockService) QueryAllNullableFieldsTypes(ctx context.Context, in *produ Name: "Full Data Entry", OptionalString: &wrapperspb.StringValue{Value: "Optional String Value"}, OptionalInt: &wrapperspb.Int32Value{Value: 42}, - OptionalFloat: &wrapperspb.DoubleValue{Value: 3.14}, + OptionalFloat: &wrapperspb.DoubleValue{Value: math.MaxFloat64}, OptionalBoolean: &wrapperspb.BoolValue{Value: true}, RequiredString: "Required String 1", RequiredInt: 100, From 182bf26d3d25a72c3f1940462cff93e87410456a Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 28 Jul 2025 14:26:11 +0200 Subject: [PATCH 15/16] chore: move helper function to ast --- v2/pkg/ast/ast_type.go | 24 +++++++++++++++++++ .../grpc_datasource/execution_plan_visitor.go | 18 +------------- .../grpc_datasource/grpc_datasource_test.go | 3 ++- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/v2/pkg/ast/ast_type.go b/v2/pkg/ast/ast_type.go index 4ff4b38174..4a17d8f268 100644 --- a/v2/pkg/ast/ast_type.go +++ b/v2/pkg/ast/ast_type.go @@ -270,3 +270,27 @@ func (d *Document) ResolveListOrNameType(ref int) (typeRef int) { } return } + +// ResolveNestedListOrListType returns the underlying type of a list. +// In contrast to ResolveListOrNameType, this function does not unwrap a non-null type. +// e.g.: +// * [[String]] -> [String] +// * [[String]!] -> [String]! +// * [String!]! -> String! +// * [String]! -> String +func (d *Document) ResolveNestedListOrListType(ref int) int { + if !d.TypeIsList(ref) { + return ref + } + + graphqlType := d.Types[ref] + if graphqlType.TypeKind == TypeKindNonNull { + graphqlType = d.Types[graphqlType.OfType] + } + + if graphqlType.TypeKind == TypeKindList { + return graphqlType.OfType + } + + return ref +} diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go index 83f6850641..83db8f324a 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go @@ -596,28 +596,12 @@ func (r *rpcPlanVisitor) createListMetadata(typeRef int) *ListMetadata { Optional: !r.definition.TypeIsNonNull(typeRef), } - typeRef = r.unwrapListNesting(typeRef) + typeRef = r.definition.ResolveNestedListOrListType(typeRef) } return md } -func (r *rpcPlanVisitor) unwrapListNesting(typeRef int) int { - if !r.definition.TypeIsList(typeRef) { - return typeRef - } - - if r.definition.TypeIsNonNull(typeRef) { - typeRef = r.definition.Types[typeRef].OfType - } - - if r.definition.Types[typeRef].TypeKind == ast.TypeKindList { - typeRef = r.definition.Types[typeRef].OfType - } - - return typeRef -} - func (r *rpcPlanVisitor) resolveEntityInformation(inlineFragmentRef int) { // TODO support multiple entities in a single query if !r.planInfo.isEntityLookup || r.planInfo.entityInfo.name != "" { diff --git a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go index 87f07299cc..88dd342dff 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go +++ b/v2/pkg/engine/datasource/grpc_datasource/grpc_datasource_test.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "math" "net" "strings" "testing" @@ -1879,7 +1880,7 @@ func Test_DataSource_Load_WithNullableFieldsType(t *testing.T) { require.Equal(t, "Full Data Entry", firstEntry["name"]) require.Equal(t, "Optional String Value", firstEntry["optionalString"]) require.Equal(t, float64(42), firstEntry["optionalInt"]) - require.InDelta(t, float64(3.14), firstEntry["optionalFloat"], 0.01) + require.InDelta(t, math.MaxFloat64, firstEntry["optionalFloat"], 0.01) require.Equal(t, true, firstEntry["optionalBoolean"]) require.Equal(t, "Required String 1", firstEntry["requiredString"]) require.Equal(t, float64(100), firstEntry["requiredInt"]) From 66ad3ee7678c672555a54565fc0a3d3589d68258 Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Mon, 28 Jul 2025 14:52:05 +0200 Subject: [PATCH 16/16] chore: make helper more strict --- v2/pkg/ast/ast_type.go | 2 +- .../datasource/grpc_datasource/execution_plan_visitor.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/v2/pkg/ast/ast_type.go b/v2/pkg/ast/ast_type.go index 4a17d8f268..6c22f33fe3 100644 --- a/v2/pkg/ast/ast_type.go +++ b/v2/pkg/ast/ast_type.go @@ -280,7 +280,7 @@ func (d *Document) ResolveListOrNameType(ref int) (typeRef int) { // * [String]! -> String func (d *Document) ResolveNestedListOrListType(ref int) int { if !d.TypeIsList(ref) { - return ref + return InvalidRef } graphqlType := d.Types[ref] diff --git a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go index 83db8f324a..3ce12f733f 100644 --- a/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go +++ b/v2/pkg/engine/datasource/grpc_datasource/execution_plan_visitor.go @@ -597,6 +597,10 @@ func (r *rpcPlanVisitor) createListMetadata(typeRef int) *ListMetadata { } typeRef = r.definition.ResolveNestedListOrListType(typeRef) + if typeRef == ast.InvalidRef { + r.walker.StopWithInternalErr(fmt.Errorf("unable to resolve underlying list type for ref: %d", typeRef)) + return nil + } } return md