diff --git a/proto/gen/rill/runtime/v1/expression.pb.go b/proto/gen/rill/runtime/v1/expression.pb.go new file mode 100644 index 00000000000..a096cfa7531 --- /dev/null +++ b/proto/gen/rill/runtime/v1/expression.pb.go @@ -0,0 +1,399 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: rill/runtime/v1/expression.proto + +package runtimev1 + +import ( + _ "github.com/envoyproxy/protoc-gen-validate/validate" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Operation int32 + +const ( + Operation_OPERATION_UNSPECIFIED Operation = 0 + Operation_OPERATION_EQ Operation = 1 + Operation_OPERATION_NEQ Operation = 2 + Operation_OPERATION_LT Operation = 3 + Operation_OPERATION_LTE Operation = 4 + Operation_OPERATION_GT Operation = 5 + Operation_OPERATION_GTE Operation = 6 + Operation_OPERATION_OR Operation = 7 + Operation_OPERATION_AND Operation = 8 + Operation_OPERATION_IN Operation = 9 + Operation_OPERATION_NIN Operation = 10 + Operation_OPERATION_LIKE Operation = 11 + Operation_OPERATION_NLIKE Operation = 12 +) + +// Enum value maps for Operation. +var ( + Operation_name = map[int32]string{ + 0: "OPERATION_UNSPECIFIED", + 1: "OPERATION_EQ", + 2: "OPERATION_NEQ", + 3: "OPERATION_LT", + 4: "OPERATION_LTE", + 5: "OPERATION_GT", + 6: "OPERATION_GTE", + 7: "OPERATION_OR", + 8: "OPERATION_AND", + 9: "OPERATION_IN", + 10: "OPERATION_NIN", + 11: "OPERATION_LIKE", + 12: "OPERATION_NLIKE", + } + Operation_value = map[string]int32{ + "OPERATION_UNSPECIFIED": 0, + "OPERATION_EQ": 1, + "OPERATION_NEQ": 2, + "OPERATION_LT": 3, + "OPERATION_LTE": 4, + "OPERATION_GT": 5, + "OPERATION_GTE": 6, + "OPERATION_OR": 7, + "OPERATION_AND": 8, + "OPERATION_IN": 9, + "OPERATION_NIN": 10, + "OPERATION_LIKE": 11, + "OPERATION_NLIKE": 12, + } +) + +func (x Operation) Enum() *Operation { + p := new(Operation) + *p = x + return p +} + +func (x Operation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Operation) Descriptor() protoreflect.EnumDescriptor { + return file_rill_runtime_v1_expression_proto_enumTypes[0].Descriptor() +} + +func (Operation) Type() protoreflect.EnumType { + return &file_rill_runtime_v1_expression_proto_enumTypes[0] +} + +func (x Operation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Operation.Descriptor instead. +func (Operation) EnumDescriptor() ([]byte, []int) { + return file_rill_runtime_v1_expression_proto_rawDescGZIP(), []int{0} +} + +type Expression struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Expression: + // + // *Expression_Ident + // *Expression_Val + // *Expression_Cond + Expression isExpression_Expression `protobuf_oneof:"expression"` +} + +func (x *Expression) Reset() { + *x = Expression{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_expression_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Expression) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Expression) ProtoMessage() {} + +func (x *Expression) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_expression_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Expression.ProtoReflect.Descriptor instead. +func (*Expression) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_expression_proto_rawDescGZIP(), []int{0} +} + +func (m *Expression) GetExpression() isExpression_Expression { + if m != nil { + return m.Expression + } + return nil +} + +func (x *Expression) GetIdent() string { + if x, ok := x.GetExpression().(*Expression_Ident); ok { + return x.Ident + } + return "" +} + +func (x *Expression) GetVal() *structpb.Value { + if x, ok := x.GetExpression().(*Expression_Val); ok { + return x.Val + } + return nil +} + +func (x *Expression) GetCond() *Condition { + if x, ok := x.GetExpression().(*Expression_Cond); ok { + return x.Cond + } + return nil +} + +type isExpression_Expression interface { + isExpression_Expression() +} + +type Expression_Ident struct { + Ident string `protobuf:"bytes,1,opt,name=ident,proto3,oneof"` +} + +type Expression_Val struct { + Val *structpb.Value `protobuf:"bytes,2,opt,name=val,proto3,oneof"` +} + +type Expression_Cond struct { + Cond *Condition `protobuf:"bytes,3,opt,name=cond,proto3,oneof"` +} + +func (*Expression_Ident) isExpression_Expression() {} + +func (*Expression_Val) isExpression_Expression() {} + +func (*Expression_Cond) isExpression_Expression() {} + +type Condition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Op Operation `protobuf:"varint,1,opt,name=op,proto3,enum=rill.runtime.v1.Operation" json:"op,omitempty"` + Exprs []*Expression `protobuf:"bytes,2,rep,name=exprs,proto3" json:"exprs,omitempty"` +} + +func (x *Condition) Reset() { + *x = Condition{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_expression_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Condition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Condition) ProtoMessage() {} + +func (x *Condition) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_expression_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Condition.ProtoReflect.Descriptor instead. +func (*Condition) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_expression_proto_rawDescGZIP(), []int{1} +} + +func (x *Condition) GetOp() Operation { + if x != nil { + return x.Op + } + return Operation_OPERATION_UNSPECIFIED +} + +func (x *Condition) GetExprs() []*Expression { + if x != nil { + return x.Exprs + } + return nil +} + +var File_rill_runtime_v1_expression_proto protoreflect.FileDescriptor + +var file_rill_runtime_v1_expression_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0f, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x90, 0x01, 0x0a, 0x0a, 0x45, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x05, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x12, 0x2a, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, + 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x42, + 0x0c, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x74, 0x0a, + 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x02, 0x6f, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x02, 0x6f, 0x70, + 0x12, 0x31, 0x0a, 0x05, 0x65, 0x78, 0x70, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x2a, 0x88, 0x02, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x51, 0x10, 0x01, 0x12, 0x11, + 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x45, 0x51, 0x10, + 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, + 0x54, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x54, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x54, 0x45, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x52, 0x10, 0x07, 0x12, 0x11, 0x0a, + 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x10, 0x08, + 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, + 0x10, 0x09, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x4e, 0x49, 0x4e, 0x10, 0x0a, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x0c, 0x42, 0xc2, + 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0f, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, + 0x69, 0x6c, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x69, + 0x6c, 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, 0x02, 0x0f, + 0x52, 0x69, 0x6c, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x1b, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x11, 0x52, 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_rill_runtime_v1_expression_proto_rawDescOnce sync.Once + file_rill_runtime_v1_expression_proto_rawDescData = file_rill_runtime_v1_expression_proto_rawDesc +) + +func file_rill_runtime_v1_expression_proto_rawDescGZIP() []byte { + file_rill_runtime_v1_expression_proto_rawDescOnce.Do(func() { + file_rill_runtime_v1_expression_proto_rawDescData = protoimpl.X.CompressGZIP(file_rill_runtime_v1_expression_proto_rawDescData) + }) + return file_rill_runtime_v1_expression_proto_rawDescData +} + +var file_rill_runtime_v1_expression_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_rill_runtime_v1_expression_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_rill_runtime_v1_expression_proto_goTypes = []interface{}{ + (Operation)(0), // 0: rill.runtime.v1.Operation + (*Expression)(nil), // 1: rill.runtime.v1.Expression + (*Condition)(nil), // 2: rill.runtime.v1.Condition + (*structpb.Value)(nil), // 3: google.protobuf.Value +} +var file_rill_runtime_v1_expression_proto_depIdxs = []int32{ + 3, // 0: rill.runtime.v1.Expression.val:type_name -> google.protobuf.Value + 2, // 1: rill.runtime.v1.Expression.cond:type_name -> rill.runtime.v1.Condition + 0, // 2: rill.runtime.v1.Condition.op:type_name -> rill.runtime.v1.Operation + 1, // 3: rill.runtime.v1.Condition.exprs:type_name -> rill.runtime.v1.Expression + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_rill_runtime_v1_expression_proto_init() } +func file_rill_runtime_v1_expression_proto_init() { + if File_rill_runtime_v1_expression_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_rill_runtime_v1_expression_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Expression); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_expression_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Condition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_rill_runtime_v1_expression_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*Expression_Ident)(nil), + (*Expression_Val)(nil), + (*Expression_Cond)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_rill_runtime_v1_expression_proto_rawDesc, + NumEnums: 1, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_rill_runtime_v1_expression_proto_goTypes, + DependencyIndexes: file_rill_runtime_v1_expression_proto_depIdxs, + EnumInfos: file_rill_runtime_v1_expression_proto_enumTypes, + MessageInfos: file_rill_runtime_v1_expression_proto_msgTypes, + }.Build() + File_rill_runtime_v1_expression_proto = out.File + file_rill_runtime_v1_expression_proto_rawDesc = nil + file_rill_runtime_v1_expression_proto_goTypes = nil + file_rill_runtime_v1_expression_proto_depIdxs = nil +} diff --git a/proto/gen/rill/runtime/v1/expression.pb.validate.go b/proto/gen/rill/runtime/v1/expression.pb.validate.go new file mode 100644 index 00000000000..126d601e826 --- /dev/null +++ b/proto/gen/rill/runtime/v1/expression.pb.validate.go @@ -0,0 +1,378 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: rill/runtime/v1/expression.proto + +package runtimev1 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on Expression with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Expression) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Expression with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in ExpressionMultiError, or +// nil if none found. +func (m *Expression) ValidateAll() error { + return m.validate(true) +} + +func (m *Expression) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + switch v := m.Expression.(type) { + case *Expression_Ident: + if v == nil { + err := ExpressionValidationError{ + field: "Expression", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + // no validation rules for Ident + case *Expression_Val: + if v == nil { + err := ExpressionValidationError{ + field: "Expression", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetVal()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExpressionValidationError{ + field: "Val", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExpressionValidationError{ + field: "Val", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetVal()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExpressionValidationError{ + field: "Val", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Expression_Cond: + if v == nil { + err := ExpressionValidationError{ + field: "Expression", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetCond()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExpressionValidationError{ + field: "Cond", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExpressionValidationError{ + field: "Cond", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCond()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExpressionValidationError{ + field: "Cond", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + + if len(errors) > 0 { + return ExpressionMultiError(errors) + } + + return nil +} + +// ExpressionMultiError is an error wrapping multiple validation errors +// returned by Expression.ValidateAll() if the designated constraints aren't met. +type ExpressionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ExpressionMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ExpressionMultiError) AllErrors() []error { return m } + +// ExpressionValidationError is the validation error returned by +// Expression.Validate if the designated constraints aren't met. +type ExpressionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ExpressionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ExpressionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ExpressionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ExpressionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ExpressionValidationError) ErrorName() string { return "ExpressionValidationError" } + +// Error satisfies the builtin error interface +func (e ExpressionValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sExpression.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ExpressionValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ExpressionValidationError{} + +// Validate checks the field values on Condition with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Condition) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Condition with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in ConditionMultiError, or nil +// if none found. +func (m *Condition) ValidateAll() error { + return m.validate(true) +} + +func (m *Condition) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if _, ok := Operation_name[int32(m.GetOp())]; !ok { + err := ConditionValidationError{ + field: "Op", + reason: "value must be one of the defined enum values", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetExprs() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ConditionValidationError{ + field: fmt.Sprintf("Exprs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ConditionValidationError{ + field: fmt.Sprintf("Exprs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ConditionValidationError{ + field: fmt.Sprintf("Exprs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return ConditionMultiError(errors) + } + + return nil +} + +// ConditionMultiError is an error wrapping multiple validation errors returned +// by Condition.ValidateAll() if the designated constraints aren't met. +type ConditionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ConditionMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ConditionMultiError) AllErrors() []error { return m } + +// ConditionValidationError is the validation error returned by +// Condition.Validate if the designated constraints aren't met. +type ConditionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ConditionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ConditionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ConditionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ConditionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ConditionValidationError) ErrorName() string { return "ConditionValidationError" } + +// Error satisfies the builtin error interface +func (e ConditionValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCondition.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ConditionValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ConditionValidationError{} diff --git a/proto/gen/rill/runtime/v1/queries.pb.go b/proto/gen/rill/runtime/v1/queries.pb.go index 5cc1f198512..2a4211c7ccf 100644 --- a/proto/gen/rill/runtime/v1/queries.pb.go +++ b/proto/gen/rill/runtime/v1/queries.pb.go @@ -73,6 +73,7 @@ func (BuiltinMeasure) EnumDescriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{0} } +// Present for backwards compatibility type MetricsViewComparisonSortType int32 const ( @@ -128,6 +129,61 @@ func (MetricsViewComparisonSortType) EnumDescriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{1} } +type MetricsViewComparisonMeasureType int32 + +const ( + MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED MetricsViewComparisonMeasureType = 0 + MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE MetricsViewComparisonMeasureType = 1 + MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE MetricsViewComparisonMeasureType = 2 + MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA MetricsViewComparisonMeasureType = 3 + MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA MetricsViewComparisonMeasureType = 4 +) + +// Enum value maps for MetricsViewComparisonMeasureType. +var ( + MetricsViewComparisonMeasureType_name = map[int32]string{ + 0: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED", + 1: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE", + 2: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE", + 3: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA", + 4: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA", + } + MetricsViewComparisonMeasureType_value = map[string]int32{ + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED": 0, + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE": 1, + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE": 2, + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA": 3, + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA": 4, + } +) + +func (x MetricsViewComparisonMeasureType) Enum() *MetricsViewComparisonMeasureType { + p := new(MetricsViewComparisonMeasureType) + *p = x + return p +} + +func (x MetricsViewComparisonMeasureType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MetricsViewComparisonMeasureType) Descriptor() protoreflect.EnumDescriptor { + return file_rill_runtime_v1_queries_proto_enumTypes[2].Descriptor() +} + +func (MetricsViewComparisonMeasureType) Type() protoreflect.EnumType { + return &file_rill_runtime_v1_queries_proto_enumTypes[2] +} + +func (x MetricsViewComparisonMeasureType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MetricsViewComparisonMeasureType.Descriptor instead. +func (MetricsViewComparisonMeasureType) EnumDescriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{2} +} + type HistogramMethod int32 const ( @@ -161,11 +217,11 @@ func (x HistogramMethod) String() string { } func (HistogramMethod) Descriptor() protoreflect.EnumDescriptor { - return file_rill_runtime_v1_queries_proto_enumTypes[2].Descriptor() + return file_rill_runtime_v1_queries_proto_enumTypes[3].Descriptor() } func (HistogramMethod) Type() protoreflect.EnumType { - return &file_rill_runtime_v1_queries_proto_enumTypes[2] + return &file_rill_runtime_v1_queries_proto_enumTypes[3] } func (x HistogramMethod) Number() protoreflect.EnumNumber { @@ -174,7 +230,7 @@ func (x HistogramMethod) Number() protoreflect.EnumNumber { // Deprecated: Use HistogramMethod.Descriptor instead. func (HistogramMethod) EnumDescriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{2} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{3} } type QueryRequest struct { @@ -1214,10 +1270,12 @@ type MetricsViewAggregationRequest struct { TimeRange *TimeRange `protobuf:"bytes,12,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` TimeStart *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` // Deprecated in favor of time_range TimeEnd *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` // Deprecated in favor of time_range - Filter *MetricsViewFilter `protobuf:"bytes,8,opt,name=filter,proto3" json:"filter,omitempty"` + Where *Expression `protobuf:"bytes,8,opt,name=where,proto3" json:"where,omitempty"` + Having *Expression `protobuf:"bytes,13,opt,name=having,proto3" json:"having,omitempty"` Limit int64 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` Offset int64 `protobuf:"varint,10,opt,name=offset,proto3" json:"offset,omitempty"` Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,14,opt,name=filter,proto3" json:"filter,omitempty"` // Deprecated. should be removed once UI is moved to use new filters } func (x *MetricsViewAggregationRequest) Reset() { @@ -1308,9 +1366,16 @@ func (x *MetricsViewAggregationRequest) GetTimeEnd() *timestamppb.Timestamp { return nil } -func (x *MetricsViewAggregationRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewAggregationRequest) GetWhere() *Expression { if x != nil { - return x.Filter + return x.Where + } + return nil +} + +func (x *MetricsViewAggregationRequest) GetHaving() *Expression { + if x != nil { + return x.Having } return nil } @@ -1336,6 +1401,13 @@ func (x *MetricsViewAggregationRequest) GetPriority() int32 { return 0 } +func (x *MetricsViewAggregationRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil +} + type MetricsViewAggregationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1587,8 +1659,10 @@ type MetricsViewToplistRequest struct { Limit int64 `protobuf:"varint,7,opt,name=limit,proto3" json:"limit,omitempty"` Offset int64 `protobuf:"varint,8,opt,name=offset,proto3" json:"offset,omitempty"` Sort []*MetricsViewSort `protobuf:"bytes,9,rep,name=sort,proto3" json:"sort,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,10,opt,name=filter,proto3" json:"filter,omitempty"` + Where *Expression `protobuf:"bytes,10,opt,name=where,proto3" json:"where,omitempty"` + Having *Expression `protobuf:"bytes,13,opt,name=having,proto3" json:"having,omitempty"` Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,14,opt,name=filter,proto3" json:"filter,omitempty"` // Deprecated. should be removed once UI is moved to use new filters } func (x *MetricsViewToplistRequest) Reset() { @@ -1693,9 +1767,16 @@ func (x *MetricsViewToplistRequest) GetSort() []*MetricsViewSort { return nil } -func (x *MetricsViewToplistRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewToplistRequest) GetWhere() *Expression { if x != nil { - return x.Filter + return x.Where + } + return nil +} + +func (x *MetricsViewToplistRequest) GetHaving() *Expression { + if x != nil { + return x.Having } return nil } @@ -1707,6 +1788,13 @@ func (x *MetricsViewToplistRequest) GetPriority() int32 { return 0 } +func (x *MetricsViewToplistRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil +} + type MetricsViewToplistResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1768,18 +1856,21 @@ type MetricsViewComparisonRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` - Dimension *MetricsViewAggregationDimension `protobuf:"bytes,3,opt,name=dimension,proto3" json:"dimension,omitempty"` - Measures []*MetricsViewAggregationMeasure `protobuf:"bytes,4,rep,name=measures,proto3" json:"measures,omitempty"` - Sort []*MetricsViewComparisonSort `protobuf:"bytes,5,rep,name=sort,proto3" json:"sort,omitempty"` - TimeRange *TimeRange `protobuf:"bytes,6,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` - ComparisonTimeRange *TimeRange `protobuf:"bytes,7,opt,name=comparison_time_range,json=comparisonTimeRange,proto3" json:"comparison_time_range,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,8,opt,name=filter,proto3" json:"filter,omitempty"` - Limit int64 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` - Offset int64 `protobuf:"varint,10,opt,name=offset,proto3" json:"offset,omitempty"` - Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` - Exact bool `protobuf:"varint,13,opt,name=exact,proto3" json:"exact,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` + Dimension *MetricsViewAggregationDimension `protobuf:"bytes,3,opt,name=dimension,proto3" json:"dimension,omitempty"` + Measures []*MetricsViewAggregationMeasure `protobuf:"bytes,4,rep,name=measures,proto3" json:"measures,omitempty"` + Sort []*MetricsViewComparisonSort `protobuf:"bytes,5,rep,name=sort,proto3" json:"sort,omitempty"` + TimeRange *TimeRange `protobuf:"bytes,6,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` + ComparisonTimeRange *TimeRange `protobuf:"bytes,7,opt,name=comparison_time_range,json=comparisonTimeRange,proto3" json:"comparison_time_range,omitempty"` + Where *Expression `protobuf:"bytes,8,opt,name=where,proto3" json:"where,omitempty"` + Having *Expression `protobuf:"bytes,12,opt,name=having,proto3" json:"having,omitempty"` + Aliases []*MetricsViewComparisonMeasureAlias `protobuf:"bytes,15,rep,name=aliases,proto3" json:"aliases,omitempty"` + Limit int64 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int64 `protobuf:"varint,10,opt,name=offset,proto3" json:"offset,omitempty"` + Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` + Exact bool `protobuf:"varint,13,opt,name=exact,proto3" json:"exact,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,14,opt,name=filter,proto3" json:"filter,omitempty"` // Deprecated. should be removed once UI is moved to use new filters } func (x *MetricsViewComparisonRequest) Reset() { @@ -1863,9 +1954,23 @@ func (x *MetricsViewComparisonRequest) GetComparisonTimeRange() *TimeRange { return nil } -func (x *MetricsViewComparisonRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewComparisonRequest) GetWhere() *Expression { if x != nil { - return x.Filter + return x.Where + } + return nil +} + +func (x *MetricsViewComparisonRequest) GetHaving() *Expression { + if x != nil { + return x.Having + } + return nil +} + +func (x *MetricsViewComparisonRequest) GetAliases() []*MetricsViewComparisonMeasureAlias { + if x != nil { + return x.Aliases } return nil } @@ -1898,6 +2003,13 @@ func (x *MetricsViewComparisonRequest) GetExact() bool { return false } +func (x *MetricsViewComparisonRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil +} + // Response message for QueryService.MetricsViewComparison type MetricsViewComparisonResponse struct { state protoimpl.MessageState @@ -2038,9 +2150,10 @@ type MetricsViewComparisonSort struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Desc bool `protobuf:"varint,2,opt,name=desc,proto3" json:"desc,omitempty"` - Type MetricsViewComparisonSortType `protobuf:"varint,3,opt,name=type,proto3,enum=rill.runtime.v1.MetricsViewComparisonSortType" json:"type,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Desc bool `protobuf:"varint,2,opt,name=desc,proto3" json:"desc,omitempty"` + Type MetricsViewComparisonSortType `protobuf:"varint,3,opt,name=type,proto3,enum=rill.runtime.v1.MetricsViewComparisonSortType" json:"type,omitempty"` // Deprecated. Present for backwards compatibility for older reports + SortType MetricsViewComparisonMeasureType `protobuf:"varint,4,opt,name=sort_type,json=sortType,proto3,enum=rill.runtime.v1.MetricsViewComparisonMeasureType" json:"sort_type,omitempty"` } func (x *MetricsViewComparisonSort) Reset() { @@ -2096,6 +2209,13 @@ func (x *MetricsViewComparisonSort) GetType() MetricsViewComparisonSortType { return MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED } +func (x *MetricsViewComparisonSort) GetSortType() MetricsViewComparisonMeasureType { + if x != nil { + return x.SortType + } + return MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED +} + type MetricsViewComparisonRow struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2230,6 +2350,69 @@ func (x *MetricsViewComparisonValue) GetDeltaRel() *structpb.Value { return nil } +type MetricsViewComparisonMeasureAlias struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type MetricsViewComparisonMeasureType `protobuf:"varint,2,opt,name=type,proto3,enum=rill.runtime.v1.MetricsViewComparisonMeasureType" json:"type,omitempty"` + Alias string `protobuf:"bytes,3,opt,name=alias,proto3" json:"alias,omitempty"` +} + +func (x *MetricsViewComparisonMeasureAlias) Reset() { + *x = MetricsViewComparisonMeasureAlias{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetricsViewComparisonMeasureAlias) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetricsViewComparisonMeasureAlias) ProtoMessage() {} + +func (x *MetricsViewComparisonMeasureAlias) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetricsViewComparisonMeasureAlias.ProtoReflect.Descriptor instead. +func (*MetricsViewComparisonMeasureAlias) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{21} +} + +func (x *MetricsViewComparisonMeasureAlias) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MetricsViewComparisonMeasureAlias) GetType() MetricsViewComparisonMeasureType { + if x != nil { + return x.Type + } + return MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED +} + +func (x *MetricsViewComparisonMeasureAlias) GetAlias() string { + if x != nil { + return x.Alias + } + return "" +} + type MetricsViewTimeSeriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2242,15 +2425,17 @@ type MetricsViewTimeSeriesRequest struct { TimeStart *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` TimeEnd *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` TimeGranularity TimeGrain `protobuf:"varint,6,opt,name=time_granularity,json=timeGranularity,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_granularity,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,7,opt,name=filter,proto3" json:"filter,omitempty"` + Where *Expression `protobuf:"bytes,7,opt,name=where,proto3" json:"where,omitempty"` + Having *Expression `protobuf:"bytes,11,opt,name=having,proto3" json:"having,omitempty"` TimeZone string `protobuf:"bytes,10,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` Priority int32 `protobuf:"varint,8,opt,name=priority,proto3" json:"priority,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,12,opt,name=filter,proto3" json:"filter,omitempty"` // Deprecated. should be removed once UI is moved to use new filters } func (x *MetricsViewTimeSeriesRequest) Reset() { *x = MetricsViewTimeSeriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2263,7 +2448,7 @@ func (x *MetricsViewTimeSeriesRequest) String() string { func (*MetricsViewTimeSeriesRequest) ProtoMessage() {} func (x *MetricsViewTimeSeriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2276,7 +2461,7 @@ func (x *MetricsViewTimeSeriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewTimeSeriesRequest.ProtoReflect.Descriptor instead. func (*MetricsViewTimeSeriesRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{21} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{22} } func (x *MetricsViewTimeSeriesRequest) GetInstanceId() string { @@ -2328,9 +2513,16 @@ func (x *MetricsViewTimeSeriesRequest) GetTimeGranularity() TimeGrain { return TimeGrain_TIME_GRAIN_UNSPECIFIED } -func (x *MetricsViewTimeSeriesRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewTimeSeriesRequest) GetWhere() *Expression { if x != nil { - return x.Filter + return x.Where + } + return nil +} + +func (x *MetricsViewTimeSeriesRequest) GetHaving() *Expression { + if x != nil { + return x.Having } return nil } @@ -2349,6 +2541,13 @@ func (x *MetricsViewTimeSeriesRequest) GetPriority() int32 { return 0 } +func (x *MetricsViewTimeSeriesRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil +} + type MetricsViewTimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2361,7 +2560,7 @@ type MetricsViewTimeSeriesResponse struct { func (x *MetricsViewTimeSeriesResponse) Reset() { *x = MetricsViewTimeSeriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2374,7 +2573,7 @@ func (x *MetricsViewTimeSeriesResponse) String() string { func (*MetricsViewTimeSeriesResponse) ProtoMessage() {} func (x *MetricsViewTimeSeriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2387,7 +2586,7 @@ func (x *MetricsViewTimeSeriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewTimeSeriesResponse.ProtoReflect.Descriptor instead. func (*MetricsViewTimeSeriesResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{22} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{23} } func (x *MetricsViewTimeSeriesResponse) GetMeta() []*MetricsViewColumn { @@ -2415,14 +2614,15 @@ type MetricsViewTotalsRequest struct { InlineMeasures []*InlineMeasure `protobuf:"bytes,9,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` TimeStart *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` TimeEnd *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,7,opt,name=filter,proto3" json:"filter,omitempty"` + Where *Expression `protobuf:"bytes,7,opt,name=where,proto3" json:"where,omitempty"` Priority int32 `protobuf:"varint,8,opt,name=priority,proto3" json:"priority,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,10,opt,name=filter,proto3" json:"filter,omitempty"` // Deprecated. should be removed once UI is moved to use new filters } func (x *MetricsViewTotalsRequest) Reset() { *x = MetricsViewTotalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2435,7 +2635,7 @@ func (x *MetricsViewTotalsRequest) String() string { func (*MetricsViewTotalsRequest) ProtoMessage() {} func (x *MetricsViewTotalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2448,7 +2648,7 @@ func (x *MetricsViewTotalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewTotalsRequest.ProtoReflect.Descriptor instead. func (*MetricsViewTotalsRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{23} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{24} } func (x *MetricsViewTotalsRequest) GetInstanceId() string { @@ -2493,9 +2693,9 @@ func (x *MetricsViewTotalsRequest) GetTimeEnd() *timestamppb.Timestamp { return nil } -func (x *MetricsViewTotalsRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewTotalsRequest) GetWhere() *Expression { if x != nil { - return x.Filter + return x.Where } return nil } @@ -2507,6 +2707,13 @@ func (x *MetricsViewTotalsRequest) GetPriority() int32 { return 0 } +func (x *MetricsViewTotalsRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil +} + type MetricsViewTotalsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2519,7 +2726,7 @@ type MetricsViewTotalsResponse struct { func (x *MetricsViewTotalsResponse) Reset() { *x = MetricsViewTotalsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2532,7 +2739,7 @@ func (x *MetricsViewTotalsResponse) String() string { func (*MetricsViewTotalsResponse) ProtoMessage() {} func (x *MetricsViewTotalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2545,7 +2752,7 @@ func (x *MetricsViewTotalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewTotalsResponse.ProtoReflect.Descriptor instead. func (*MetricsViewTotalsResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{24} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{25} } func (x *MetricsViewTotalsResponse) GetMeta() []*MetricsViewColumn { @@ -2572,18 +2779,19 @@ type MetricsViewRowsRequest struct { TimeStart *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` TimeEnd *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` TimeGranularity TimeGrain `protobuf:"varint,10,opt,name=time_granularity,json=timeGranularity,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_granularity,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` + Where *Expression `protobuf:"bytes,5,opt,name=where,proto3" json:"where,omitempty"` Sort []*MetricsViewSort `protobuf:"bytes,6,rep,name=sort,proto3" json:"sort,omitempty"` Limit int32 `protobuf:"varint,7,opt,name=limit,proto3" json:"limit,omitempty"` Offset int64 `protobuf:"varint,8,opt,name=offset,proto3" json:"offset,omitempty"` Priority int32 `protobuf:"varint,9,opt,name=priority,proto3" json:"priority,omitempty"` TimeZone string `protobuf:"bytes,11,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,12,opt,name=filter,proto3" json:"filter,omitempty"` // Deprecated. should be removed once UI is moved to use new filters } func (x *MetricsViewRowsRequest) Reset() { *x = MetricsViewRowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2596,7 +2804,7 @@ func (x *MetricsViewRowsRequest) String() string { func (*MetricsViewRowsRequest) ProtoMessage() {} func (x *MetricsViewRowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2609,7 +2817,7 @@ func (x *MetricsViewRowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewRowsRequest.ProtoReflect.Descriptor instead. func (*MetricsViewRowsRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{25} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{26} } func (x *MetricsViewRowsRequest) GetInstanceId() string { @@ -2647,9 +2855,9 @@ func (x *MetricsViewRowsRequest) GetTimeGranularity() TimeGrain { return TimeGrain_TIME_GRAIN_UNSPECIFIED } -func (x *MetricsViewRowsRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewRowsRequest) GetWhere() *Expression { if x != nil { - return x.Filter + return x.Where } return nil } @@ -2689,6 +2897,13 @@ func (x *MetricsViewRowsRequest) GetTimeZone() string { return "" } +func (x *MetricsViewRowsRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil +} + type MetricsViewRowsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2701,7 +2916,7 @@ type MetricsViewRowsResponse struct { func (x *MetricsViewRowsResponse) Reset() { *x = MetricsViewRowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2714,7 +2929,7 @@ func (x *MetricsViewRowsResponse) String() string { func (*MetricsViewRowsResponse) ProtoMessage() {} func (x *MetricsViewRowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2727,7 +2942,7 @@ func (x *MetricsViewRowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewRowsResponse.ProtoReflect.Descriptor instead. func (*MetricsViewRowsResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{26} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{27} } func (x *MetricsViewRowsResponse) GetMeta() []*MetricsViewColumn { @@ -2756,7 +2971,7 @@ type MetricsViewSort struct { func (x *MetricsViewSort) Reset() { *x = MetricsViewSort{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2769,7 +2984,7 @@ func (x *MetricsViewSort) String() string { func (*MetricsViewSort) ProtoMessage() {} func (x *MetricsViewSort) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2782,7 +2997,7 @@ func (x *MetricsViewSort) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewSort.ProtoReflect.Descriptor instead. func (*MetricsViewSort) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{27} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{28} } func (x *MetricsViewSort) GetName() string { @@ -2811,7 +3026,7 @@ type MetricsViewFilter struct { func (x *MetricsViewFilter) Reset() { *x = MetricsViewFilter{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2824,7 +3039,7 @@ func (x *MetricsViewFilter) String() string { func (*MetricsViewFilter) ProtoMessage() {} func (x *MetricsViewFilter) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2837,7 +3052,7 @@ func (x *MetricsViewFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewFilter.ProtoReflect.Descriptor instead. func (*MetricsViewFilter) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{28} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{29} } func (x *MetricsViewFilter) GetInclude() []*MetricsViewFilter_Cond { @@ -2867,7 +3082,7 @@ type MetricsViewColumn struct { func (x *MetricsViewColumn) Reset() { *x = MetricsViewColumn{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2880,7 +3095,7 @@ func (x *MetricsViewColumn) String() string { func (*MetricsViewColumn) ProtoMessage() {} func (x *MetricsViewColumn) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2893,7 +3108,7 @@ func (x *MetricsViewColumn) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewColumn.ProtoReflect.Descriptor instead. func (*MetricsViewColumn) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{29} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{30} } func (x *MetricsViewColumn) GetName() string { @@ -2929,7 +3144,7 @@ type InlineMeasure struct { func (x *InlineMeasure) Reset() { *x = InlineMeasure{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2942,7 +3157,7 @@ func (x *InlineMeasure) String() string { func (*InlineMeasure) ProtoMessage() {} func (x *InlineMeasure) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2955,7 +3170,7 @@ func (x *InlineMeasure) ProtoReflect() protoreflect.Message { // Deprecated: Use InlineMeasure.ProtoReflect.Descriptor instead. func (*InlineMeasure) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{30} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{31} } func (x *InlineMeasure) GetName() string { @@ -2985,7 +3200,7 @@ type MetricsViewTimeRangeRequest struct { func (x *MetricsViewTimeRangeRequest) Reset() { *x = MetricsViewTimeRangeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2998,7 +3213,7 @@ func (x *MetricsViewTimeRangeRequest) String() string { func (*MetricsViewTimeRangeRequest) ProtoMessage() {} func (x *MetricsViewTimeRangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3011,7 +3226,7 @@ func (x *MetricsViewTimeRangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewTimeRangeRequest.ProtoReflect.Descriptor instead. func (*MetricsViewTimeRangeRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{31} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{32} } func (x *MetricsViewTimeRangeRequest) GetInstanceId() string { @@ -3046,7 +3261,7 @@ type MetricsViewTimeRangeResponse struct { func (x *MetricsViewTimeRangeResponse) Reset() { *x = MetricsViewTimeRangeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3059,7 +3274,7 @@ func (x *MetricsViewTimeRangeResponse) String() string { func (*MetricsViewTimeRangeResponse) ProtoMessage() {} func (x *MetricsViewTimeRangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3072,7 +3287,7 @@ func (x *MetricsViewTimeRangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewTimeRangeResponse.ProtoReflect.Descriptor instead. func (*MetricsViewTimeRangeResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{32} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{33} } func (x *MetricsViewTimeRangeResponse) GetTimeRangeSummary() *TimeRangeSummary { @@ -3096,7 +3311,7 @@ type ColumnRollupIntervalRequest struct { func (x *ColumnRollupIntervalRequest) Reset() { *x = ColumnRollupIntervalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3109,7 +3324,7 @@ func (x *ColumnRollupIntervalRequest) String() string { func (*ColumnRollupIntervalRequest) ProtoMessage() {} func (x *ColumnRollupIntervalRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3122,7 +3337,7 @@ func (x *ColumnRollupIntervalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnRollupIntervalRequest.ProtoReflect.Descriptor instead. func (*ColumnRollupIntervalRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{33} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{34} } func (x *ColumnRollupIntervalRequest) GetInstanceId() string { @@ -3166,7 +3381,7 @@ type ColumnRollupIntervalResponse struct { func (x *ColumnRollupIntervalResponse) Reset() { *x = ColumnRollupIntervalResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3179,7 +3394,7 @@ func (x *ColumnRollupIntervalResponse) String() string { func (*ColumnRollupIntervalResponse) ProtoMessage() {} func (x *ColumnRollupIntervalResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3192,7 +3407,7 @@ func (x *ColumnRollupIntervalResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnRollupIntervalResponse.ProtoReflect.Descriptor instead. func (*ColumnRollupIntervalResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{34} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{35} } func (x *ColumnRollupIntervalResponse) GetStart() *timestamppb.Timestamp { @@ -3232,7 +3447,7 @@ type ColumnTopKRequest struct { func (x *ColumnTopKRequest) Reset() { *x = ColumnTopKRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3245,7 +3460,7 @@ func (x *ColumnTopKRequest) String() string { func (*ColumnTopKRequest) ProtoMessage() {} func (x *ColumnTopKRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3258,7 +3473,7 @@ func (x *ColumnTopKRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTopKRequest.ProtoReflect.Descriptor instead. func (*ColumnTopKRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{35} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{36} } func (x *ColumnTopKRequest) GetInstanceId() string { @@ -3314,7 +3529,7 @@ type ColumnTopKResponse struct { func (x *ColumnTopKResponse) Reset() { *x = ColumnTopKResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3327,7 +3542,7 @@ func (x *ColumnTopKResponse) String() string { func (*ColumnTopKResponse) ProtoMessage() {} func (x *ColumnTopKResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3340,7 +3555,7 @@ func (x *ColumnTopKResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTopKResponse.ProtoReflect.Descriptor instead. func (*ColumnTopKResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{36} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{37} } func (x *ColumnTopKResponse) GetCategoricalSummary() *CategoricalSummary { @@ -3365,7 +3580,7 @@ type CategoricalSummary struct { func (x *CategoricalSummary) Reset() { *x = CategoricalSummary{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3378,7 +3593,7 @@ func (x *CategoricalSummary) String() string { func (*CategoricalSummary) ProtoMessage() {} func (x *CategoricalSummary) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3391,7 +3606,7 @@ func (x *CategoricalSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use CategoricalSummary.ProtoReflect.Descriptor instead. func (*CategoricalSummary) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{37} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{38} } func (m *CategoricalSummary) GetCase() isCategoricalSummary_Case { @@ -3442,7 +3657,7 @@ type TopK struct { func (x *TopK) Reset() { *x = TopK{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3455,7 +3670,7 @@ func (x *TopK) String() string { func (*TopK) ProtoMessage() {} func (x *TopK) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3468,7 +3683,7 @@ func (x *TopK) ProtoReflect() protoreflect.Message { // Deprecated: Use TopK.ProtoReflect.Descriptor instead. func (*TopK) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{38} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{39} } func (x *TopK) GetEntries() []*TopK_Entry { @@ -3492,7 +3707,7 @@ type ColumnNullCountRequest struct { func (x *ColumnNullCountRequest) Reset() { *x = ColumnNullCountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3505,7 +3720,7 @@ func (x *ColumnNullCountRequest) String() string { func (*ColumnNullCountRequest) ProtoMessage() {} func (x *ColumnNullCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3518,7 +3733,7 @@ func (x *ColumnNullCountRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnNullCountRequest.ProtoReflect.Descriptor instead. func (*ColumnNullCountRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{39} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{40} } func (x *ColumnNullCountRequest) GetInstanceId() string { @@ -3560,7 +3775,7 @@ type ColumnNullCountResponse struct { func (x *ColumnNullCountResponse) Reset() { *x = ColumnNullCountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3573,7 +3788,7 @@ func (x *ColumnNullCountResponse) String() string { func (*ColumnNullCountResponse) ProtoMessage() {} func (x *ColumnNullCountResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3586,7 +3801,7 @@ func (x *ColumnNullCountResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnNullCountResponse.ProtoReflect.Descriptor instead. func (*ColumnNullCountResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{40} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{41} } func (x *ColumnNullCountResponse) GetCount() float64 { @@ -3610,7 +3825,7 @@ type ColumnDescriptiveStatisticsRequest struct { func (x *ColumnDescriptiveStatisticsRequest) Reset() { *x = ColumnDescriptiveStatisticsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3623,7 +3838,7 @@ func (x *ColumnDescriptiveStatisticsRequest) String() string { func (*ColumnDescriptiveStatisticsRequest) ProtoMessage() {} func (x *ColumnDescriptiveStatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3636,7 +3851,7 @@ func (x *ColumnDescriptiveStatisticsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ColumnDescriptiveStatisticsRequest.ProtoReflect.Descriptor instead. func (*ColumnDescriptiveStatisticsRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{41} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{42} } func (x *ColumnDescriptiveStatisticsRequest) GetInstanceId() string { @@ -3678,7 +3893,7 @@ type ColumnDescriptiveStatisticsResponse struct { func (x *ColumnDescriptiveStatisticsResponse) Reset() { *x = ColumnDescriptiveStatisticsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3691,7 +3906,7 @@ func (x *ColumnDescriptiveStatisticsResponse) String() string { func (*ColumnDescriptiveStatisticsResponse) ProtoMessage() {} func (x *ColumnDescriptiveStatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3704,7 +3919,7 @@ func (x *ColumnDescriptiveStatisticsResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ColumnDescriptiveStatisticsResponse.ProtoReflect.Descriptor instead. func (*ColumnDescriptiveStatisticsResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{42} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{43} } func (x *ColumnDescriptiveStatisticsResponse) GetNumericSummary() *NumericSummary { @@ -3730,7 +3945,7 @@ type NumericSummary struct { func (x *NumericSummary) Reset() { *x = NumericSummary{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3743,7 +3958,7 @@ func (x *NumericSummary) String() string { func (*NumericSummary) ProtoMessage() {} func (x *NumericSummary) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3756,7 +3971,7 @@ func (x *NumericSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use NumericSummary.ProtoReflect.Descriptor instead. func (*NumericSummary) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{43} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{44} } func (m *NumericSummary) GetCase() isNumericSummary_Case { @@ -3820,7 +4035,7 @@ type NumericHistogramBins struct { func (x *NumericHistogramBins) Reset() { *x = NumericHistogramBins{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3833,7 +4048,7 @@ func (x *NumericHistogramBins) String() string { func (*NumericHistogramBins) ProtoMessage() {} func (x *NumericHistogramBins) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3846,7 +4061,7 @@ func (x *NumericHistogramBins) ProtoReflect() protoreflect.Message { // Deprecated: Use NumericHistogramBins.ProtoReflect.Descriptor instead. func (*NumericHistogramBins) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{44} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{45} } func (x *NumericHistogramBins) GetBins() []*NumericHistogramBins_Bin { @@ -3873,7 +4088,7 @@ type NumericStatistics struct { func (x *NumericStatistics) Reset() { *x = NumericStatistics{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3886,7 +4101,7 @@ func (x *NumericStatistics) String() string { func (*NumericStatistics) ProtoMessage() {} func (x *NumericStatistics) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3899,7 +4114,7 @@ func (x *NumericStatistics) ProtoReflect() protoreflect.Message { // Deprecated: Use NumericStatistics.ProtoReflect.Descriptor instead. func (*NumericStatistics) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{45} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{46} } func (x *NumericStatistics) GetMin() float64 { @@ -3962,7 +4177,7 @@ type NumericOutliers struct { func (x *NumericOutliers) Reset() { *x = NumericOutliers{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3975,7 +4190,7 @@ func (x *NumericOutliers) String() string { func (*NumericOutliers) ProtoMessage() {} func (x *NumericOutliers) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3988,7 +4203,7 @@ func (x *NumericOutliers) ProtoReflect() protoreflect.Message { // Deprecated: Use NumericOutliers.ProtoReflect.Descriptor instead. func (*NumericOutliers) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{46} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{47} } func (x *NumericOutliers) GetOutliers() []*NumericOutliers_Outlier { @@ -4012,7 +4227,7 @@ type ColumnTimeGrainRequest struct { func (x *ColumnTimeGrainRequest) Reset() { *x = ColumnTimeGrainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[47] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4025,7 +4240,7 @@ func (x *ColumnTimeGrainRequest) String() string { func (*ColumnTimeGrainRequest) ProtoMessage() {} func (x *ColumnTimeGrainRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[47] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4038,7 +4253,7 @@ func (x *ColumnTimeGrainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTimeGrainRequest.ProtoReflect.Descriptor instead. func (*ColumnTimeGrainRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{47} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{48} } func (x *ColumnTimeGrainRequest) GetInstanceId() string { @@ -4080,7 +4295,7 @@ type ColumnTimeGrainResponse struct { func (x *ColumnTimeGrainResponse) Reset() { *x = ColumnTimeGrainResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[48] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4093,7 +4308,7 @@ func (x *ColumnTimeGrainResponse) String() string { func (*ColumnTimeGrainResponse) ProtoMessage() {} func (x *ColumnTimeGrainResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[48] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4106,7 +4321,7 @@ func (x *ColumnTimeGrainResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTimeGrainResponse.ProtoReflect.Descriptor instead. func (*ColumnTimeGrainResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{48} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{49} } func (x *ColumnTimeGrainResponse) GetTimeGrain() TimeGrain { @@ -4131,7 +4346,7 @@ type ColumnNumericHistogramRequest struct { func (x *ColumnNumericHistogramRequest) Reset() { *x = ColumnNumericHistogramRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[49] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4144,7 +4359,7 @@ func (x *ColumnNumericHistogramRequest) String() string { func (*ColumnNumericHistogramRequest) ProtoMessage() {} func (x *ColumnNumericHistogramRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[49] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4157,7 +4372,7 @@ func (x *ColumnNumericHistogramRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnNumericHistogramRequest.ProtoReflect.Descriptor instead. func (*ColumnNumericHistogramRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{49} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{50} } func (x *ColumnNumericHistogramRequest) GetInstanceId() string { @@ -4206,7 +4421,7 @@ type ColumnNumericHistogramResponse struct { func (x *ColumnNumericHistogramResponse) Reset() { *x = ColumnNumericHistogramResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[50] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4219,7 +4434,7 @@ func (x *ColumnNumericHistogramResponse) String() string { func (*ColumnNumericHistogramResponse) ProtoMessage() {} func (x *ColumnNumericHistogramResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[50] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4232,7 +4447,7 @@ func (x *ColumnNumericHistogramResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnNumericHistogramResponse.ProtoReflect.Descriptor instead. func (*ColumnNumericHistogramResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{50} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{51} } func (x *ColumnNumericHistogramResponse) GetNumericSummary() *NumericSummary { @@ -4256,7 +4471,7 @@ type ColumnRugHistogramRequest struct { func (x *ColumnRugHistogramRequest) Reset() { *x = ColumnRugHistogramRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[51] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4269,7 +4484,7 @@ func (x *ColumnRugHistogramRequest) String() string { func (*ColumnRugHistogramRequest) ProtoMessage() {} func (x *ColumnRugHistogramRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[51] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4282,7 +4497,7 @@ func (x *ColumnRugHistogramRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnRugHistogramRequest.ProtoReflect.Descriptor instead. func (*ColumnRugHistogramRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{51} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{52} } func (x *ColumnRugHistogramRequest) GetInstanceId() string { @@ -4324,7 +4539,7 @@ type ColumnRugHistogramResponse struct { func (x *ColumnRugHistogramResponse) Reset() { *x = ColumnRugHistogramResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[52] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4337,7 +4552,7 @@ func (x *ColumnRugHistogramResponse) String() string { func (*ColumnRugHistogramResponse) ProtoMessage() {} func (x *ColumnRugHistogramResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[52] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4350,7 +4565,7 @@ func (x *ColumnRugHistogramResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnRugHistogramResponse.ProtoReflect.Descriptor instead. func (*ColumnRugHistogramResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{52} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{53} } func (x *ColumnRugHistogramResponse) GetNumericSummary() *NumericSummary { @@ -4374,7 +4589,7 @@ type ColumnTimeRangeRequest struct { func (x *ColumnTimeRangeRequest) Reset() { *x = ColumnTimeRangeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[53] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4387,7 +4602,7 @@ func (x *ColumnTimeRangeRequest) String() string { func (*ColumnTimeRangeRequest) ProtoMessage() {} func (x *ColumnTimeRangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[53] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4400,7 +4615,7 @@ func (x *ColumnTimeRangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTimeRangeRequest.ProtoReflect.Descriptor instead. func (*ColumnTimeRangeRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{53} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{54} } func (x *ColumnTimeRangeRequest) GetInstanceId() string { @@ -4442,7 +4657,7 @@ type ColumnTimeRangeResponse struct { func (x *ColumnTimeRangeResponse) Reset() { *x = ColumnTimeRangeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[54] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4455,7 +4670,7 @@ func (x *ColumnTimeRangeResponse) String() string { func (*ColumnTimeRangeResponse) ProtoMessage() {} func (x *ColumnTimeRangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[54] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4468,7 +4683,7 @@ func (x *ColumnTimeRangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTimeRangeResponse.ProtoReflect.Descriptor instead. func (*ColumnTimeRangeResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{54} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{55} } func (x *ColumnTimeRangeResponse) GetTimeRangeSummary() *TimeRangeSummary { @@ -4491,7 +4706,7 @@ type TimeRangeSummary struct { func (x *TimeRangeSummary) Reset() { *x = TimeRangeSummary{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[55] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4504,7 +4719,7 @@ func (x *TimeRangeSummary) String() string { func (*TimeRangeSummary) ProtoMessage() {} func (x *TimeRangeSummary) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[55] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4517,7 +4732,7 @@ func (x *TimeRangeSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeRangeSummary.ProtoReflect.Descriptor instead. func (*TimeRangeSummary) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{55} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{56} } func (x *TimeRangeSummary) GetMin() *timestamppb.Timestamp { @@ -4555,7 +4770,7 @@ type ColumnCardinalityRequest struct { func (x *ColumnCardinalityRequest) Reset() { *x = ColumnCardinalityRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[56] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4568,7 +4783,7 @@ func (x *ColumnCardinalityRequest) String() string { func (*ColumnCardinalityRequest) ProtoMessage() {} func (x *ColumnCardinalityRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[56] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4581,7 +4796,7 @@ func (x *ColumnCardinalityRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnCardinalityRequest.ProtoReflect.Descriptor instead. func (*ColumnCardinalityRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{56} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{57} } func (x *ColumnCardinalityRequest) GetInstanceId() string { @@ -4623,7 +4838,7 @@ type ColumnCardinalityResponse struct { func (x *ColumnCardinalityResponse) Reset() { *x = ColumnCardinalityResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[57] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4636,7 +4851,7 @@ func (x *ColumnCardinalityResponse) String() string { func (*ColumnCardinalityResponse) ProtoMessage() {} func (x *ColumnCardinalityResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[57] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4649,7 +4864,7 @@ func (x *ColumnCardinalityResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnCardinalityResponse.ProtoReflect.Descriptor instead. func (*ColumnCardinalityResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{57} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{58} } func (x *ColumnCardinalityResponse) GetCategoricalSummary() *CategoricalSummary { @@ -4678,7 +4893,7 @@ type ColumnTimeSeriesRequest struct { func (x *ColumnTimeSeriesRequest) Reset() { *x = ColumnTimeSeriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[58] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4691,7 +4906,7 @@ func (x *ColumnTimeSeriesRequest) String() string { func (*ColumnTimeSeriesRequest) ProtoMessage() {} func (x *ColumnTimeSeriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[58] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4704,7 +4919,7 @@ func (x *ColumnTimeSeriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTimeSeriesRequest.ProtoReflect.Descriptor instead. func (*ColumnTimeSeriesRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{58} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{59} } func (x *ColumnTimeSeriesRequest) GetInstanceId() string { @@ -4781,7 +4996,7 @@ type ColumnTimeSeriesResponse struct { func (x *ColumnTimeSeriesResponse) Reset() { *x = ColumnTimeSeriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[59] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4794,7 +5009,7 @@ func (x *ColumnTimeSeriesResponse) String() string { func (*ColumnTimeSeriesResponse) ProtoMessage() {} func (x *ColumnTimeSeriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[59] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4807,7 +5022,7 @@ func (x *ColumnTimeSeriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ColumnTimeSeriesResponse.ProtoReflect.Descriptor instead. func (*ColumnTimeSeriesResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{59} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{60} } func (x *ColumnTimeSeriesResponse) GetRollup() *TimeSeriesResponse { @@ -4830,7 +5045,7 @@ type TimeSeriesTimeRange struct { func (x *TimeSeriesTimeRange) Reset() { *x = TimeSeriesTimeRange{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[60] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4843,7 +5058,7 @@ func (x *TimeSeriesTimeRange) String() string { func (*TimeSeriesTimeRange) ProtoMessage() {} func (x *TimeSeriesTimeRange) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[60] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4856,7 +5071,7 @@ func (x *TimeSeriesTimeRange) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeSeriesTimeRange.ProtoReflect.Descriptor instead. func (*TimeSeriesTimeRange) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{60} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{61} } func (x *TimeSeriesTimeRange) GetStart() *timestamppb.Timestamp { @@ -4893,7 +5108,7 @@ type TimeSeriesResponse struct { func (x *TimeSeriesResponse) Reset() { *x = TimeSeriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[61] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4906,7 +5121,7 @@ func (x *TimeSeriesResponse) String() string { func (*TimeSeriesResponse) ProtoMessage() {} func (x *TimeSeriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[61] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4919,7 +5134,7 @@ func (x *TimeSeriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeSeriesResponse.ProtoReflect.Descriptor instead. func (*TimeSeriesResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{61} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{62} } func (x *TimeSeriesResponse) GetResults() []*TimeSeriesValue { @@ -4956,7 +5171,7 @@ type TimeSeriesValue struct { func (x *TimeSeriesValue) Reset() { *x = TimeSeriesValue{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4969,7 +5184,7 @@ func (x *TimeSeriesValue) String() string { func (*TimeSeriesValue) ProtoMessage() {} func (x *TimeSeriesValue) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4982,7 +5197,7 @@ func (x *TimeSeriesValue) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeSeriesValue.ProtoReflect.Descriptor instead. func (*TimeSeriesValue) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{62} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{63} } func (x *TimeSeriesValue) GetTs() *timestamppb.Timestamp { @@ -5019,7 +5234,7 @@ type TableCardinalityRequest struct { func (x *TableCardinalityRequest) Reset() { *x = TableCardinalityRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5032,7 +5247,7 @@ func (x *TableCardinalityRequest) String() string { func (*TableCardinalityRequest) ProtoMessage() {} func (x *TableCardinalityRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5045,7 +5260,7 @@ func (x *TableCardinalityRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TableCardinalityRequest.ProtoReflect.Descriptor instead. func (*TableCardinalityRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{63} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{64} } func (x *TableCardinalityRequest) GetInstanceId() string { @@ -5080,7 +5295,7 @@ type TableCardinalityResponse struct { func (x *TableCardinalityResponse) Reset() { *x = TableCardinalityResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5093,7 +5308,7 @@ func (x *TableCardinalityResponse) String() string { func (*TableCardinalityResponse) ProtoMessage() {} func (x *TableCardinalityResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5106,7 +5321,7 @@ func (x *TableCardinalityResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TableCardinalityResponse.ProtoReflect.Descriptor instead. func (*TableCardinalityResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{64} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{65} } func (x *TableCardinalityResponse) GetCardinality() int64 { @@ -5129,7 +5344,7 @@ type TableColumnsRequest struct { func (x *TableColumnsRequest) Reset() { *x = TableColumnsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5142,7 +5357,7 @@ func (x *TableColumnsRequest) String() string { func (*TableColumnsRequest) ProtoMessage() {} func (x *TableColumnsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5155,7 +5370,7 @@ func (x *TableColumnsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TableColumnsRequest.ProtoReflect.Descriptor instead. func (*TableColumnsRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{65} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{66} } func (x *TableColumnsRequest) GetInstanceId() string { @@ -5190,7 +5405,7 @@ type TableColumnsResponse struct { func (x *TableColumnsResponse) Reset() { *x = TableColumnsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5203,7 +5418,7 @@ func (x *TableColumnsResponse) String() string { func (*TableColumnsResponse) ProtoMessage() {} func (x *TableColumnsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5216,7 +5431,7 @@ func (x *TableColumnsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TableColumnsResponse.ProtoReflect.Descriptor instead. func (*TableColumnsResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{66} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{67} } func (x *TableColumnsResponse) GetProfileColumns() []*ProfileColumn { @@ -5239,7 +5454,7 @@ type ProfileColumn struct { func (x *ProfileColumn) Reset() { *x = ProfileColumn{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5252,7 +5467,7 @@ func (x *ProfileColumn) String() string { func (*ProfileColumn) ProtoMessage() {} func (x *ProfileColumn) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5265,7 +5480,7 @@ func (x *ProfileColumn) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileColumn.ProtoReflect.Descriptor instead. func (*ProfileColumn) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{67} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{68} } func (x *ProfileColumn) GetName() string { @@ -5303,7 +5518,7 @@ type TableRowsRequest struct { func (x *TableRowsRequest) Reset() { *x = TableRowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5316,7 +5531,7 @@ func (x *TableRowsRequest) String() string { func (*TableRowsRequest) ProtoMessage() {} func (x *TableRowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5329,7 +5544,7 @@ func (x *TableRowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TableRowsRequest.ProtoReflect.Descriptor instead. func (*TableRowsRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{68} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{69} } func (x *TableRowsRequest) GetInstanceId() string { @@ -5371,7 +5586,7 @@ type TableRowsResponse struct { func (x *TableRowsResponse) Reset() { *x = TableRowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5384,7 +5599,7 @@ func (x *TableRowsResponse) String() string { func (*TableRowsResponse) ProtoMessage() {} func (x *TableRowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5397,7 +5612,7 @@ func (x *TableRowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TableRowsResponse.ProtoReflect.Descriptor instead. func (*TableRowsResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{69} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{70} } func (x *TableRowsResponse) GetData() []*structpb.Struct { @@ -5420,7 +5635,7 @@ type MetricsViewFilter_Cond struct { func (x *MetricsViewFilter_Cond) Reset() { *x = MetricsViewFilter_Cond{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[70] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5433,7 +5648,7 @@ func (x *MetricsViewFilter_Cond) String() string { func (*MetricsViewFilter_Cond) ProtoMessage() {} func (x *MetricsViewFilter_Cond) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[70] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5446,7 +5661,7 @@ func (x *MetricsViewFilter_Cond) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsViewFilter_Cond.ProtoReflect.Descriptor instead. func (*MetricsViewFilter_Cond) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{28, 0} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{29, 0} } func (x *MetricsViewFilter_Cond) GetName() string { @@ -5482,7 +5697,7 @@ type TopK_Entry struct { func (x *TopK_Entry) Reset() { *x = TopK_Entry{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[71] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5495,7 +5710,7 @@ func (x *TopK_Entry) String() string { func (*TopK_Entry) ProtoMessage() {} func (x *TopK_Entry) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[71] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5508,7 +5723,7 @@ func (x *TopK_Entry) ProtoReflect() protoreflect.Message { // Deprecated: Use TopK_Entry.ProtoReflect.Descriptor instead. func (*TopK_Entry) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{38, 0} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{39, 0} } func (x *TopK_Entry) GetValue() *structpb.Value { @@ -5540,7 +5755,7 @@ type NumericHistogramBins_Bin struct { func (x *NumericHistogramBins_Bin) Reset() { *x = NumericHistogramBins_Bin{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[72] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5553,7 +5768,7 @@ func (x *NumericHistogramBins_Bin) String() string { func (*NumericHistogramBins_Bin) ProtoMessage() {} func (x *NumericHistogramBins_Bin) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[72] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5566,7 +5781,7 @@ func (x *NumericHistogramBins_Bin) ProtoReflect() protoreflect.Message { // Deprecated: Use NumericHistogramBins_Bin.ProtoReflect.Descriptor instead. func (*NumericHistogramBins_Bin) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{44, 0} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{45, 0} } func (x *NumericHistogramBins_Bin) GetBucket() int32 { @@ -5619,7 +5834,7 @@ type NumericOutliers_Outlier struct { func (x *NumericOutliers_Outlier) Reset() { *x = NumericOutliers_Outlier{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[73] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5632,7 +5847,7 @@ func (x *NumericOutliers_Outlier) String() string { func (*NumericOutliers_Outlier) ProtoMessage() {} func (x *NumericOutliers_Outlier) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[73] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5645,7 +5860,7 @@ func (x *NumericOutliers_Outlier) ProtoReflect() protoreflect.Message { // Deprecated: Use NumericOutliers_Outlier.ProtoReflect.Descriptor instead. func (*NumericOutliers_Outlier) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{46, 0} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{47, 0} } func (x *NumericOutliers_Outlier) GetBucket() int32 { @@ -5696,7 +5911,7 @@ type TimeRangeSummary_Interval struct { func (x *TimeRangeSummary_Interval) Reset() { *x = TimeRangeSummary_Interval{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[74] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5709,7 +5924,7 @@ func (x *TimeRangeSummary_Interval) String() string { func (*TimeRangeSummary_Interval) ProtoMessage() {} func (x *TimeRangeSummary_Interval) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[74] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5722,7 +5937,7 @@ func (x *TimeRangeSummary_Interval) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeRangeSummary_Interval.ProtoReflect.Descriptor instead. func (*TimeRangeSummary_Interval) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{55, 0} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{56, 0} } func (x *TimeRangeSummary_Interval) GetMonths() int32 { @@ -5761,7 +5976,7 @@ type ColumnTimeSeriesRequest_BasicMeasure struct { func (x *ColumnTimeSeriesRequest_BasicMeasure) Reset() { *x = ColumnTimeSeriesRequest_BasicMeasure{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[75] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5774,7 +5989,7 @@ func (x *ColumnTimeSeriesRequest_BasicMeasure) String() string { func (*ColumnTimeSeriesRequest_BasicMeasure) ProtoMessage() {} func (x *ColumnTimeSeriesRequest_BasicMeasure) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[75] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5787,7 +6002,7 @@ func (x *ColumnTimeSeriesRequest_BasicMeasure) ProtoReflect() protoreflect.Messa // Deprecated: Use ColumnTimeSeriesRequest_BasicMeasure.ProtoReflect.Descriptor instead. func (*ColumnTimeSeriesRequest_BasicMeasure) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{58, 0} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{59, 0} } func (x *ColumnTimeSeriesRequest_BasicMeasure) GetId() string { @@ -5830,548 +6045,638 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x1a, 0x20, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xde, 0x01, 0x0a, 0x0c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0b, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, 0x2d, 0x61, - 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x61, 0x72, 0x67, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x1a, 0x05, - 0x18, 0x90, 0x4e, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x6d, 0x0a, 0x0d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x66, 0x0a, 0x11, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x30, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x76, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x34, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xcc, 0x01, 0x0a, 0x0d, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x6b, - 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x62, 0x61, 0x6b, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x3c, 0x0a, 0x0e, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x11, - 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x55, 0x72, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9b, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x79, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, - 0x65, 0x77, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1d, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6d, 0x0a, - 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, - 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, - 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x76, 0x0a, 0x1f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x72, 0x69, 0x6c, + 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xde, 0x01, + 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, + 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5f, 0x5c, + 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x61, + 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x20, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0a, 0xfa, 0x42, 0x07, + 0x1a, 0x05, 0x18, 0x90, 0x4e, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x6d, + 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2f, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, + 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x66, 0x0a, + 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0x76, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x34, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xcc, 0x01, + 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2c, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x61, 0x6b, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x3c, 0x0a, 0x0e, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, + 0x0a, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9b, 0x10, 0x0a, 0x05, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x79, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, + 0x76, 0x69, 0x65, 0x77, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6d, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, + 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x77, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x76, + 0x0a, 0x1f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x77, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, + 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, + 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6a, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x73, 0x0a, 0x1e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, + 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x14, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, + 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, + 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x25, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x22, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, + 0x0a, 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, + 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, + 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x79, 0x0a, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x1d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, + 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, + 0x0a, 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x63, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, - 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, - 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x19, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x5a, 0x0a, 0x15, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x12, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x07, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0xdb, 0x10, 0x0a, 0x0b, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x7c, 0x0a, 0x21, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x18, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x73, 0x0a, 0x1e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, - 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, - 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x14, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, - 0x6f, 0x70, 0x5f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x21, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, + 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x88, 0x01, 0x0a, 0x25, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x22, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, - 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x79, 0x0a, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, - 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1d, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6d, 0x0a, - 0x1c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x69, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x63, 0x61, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, - 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x67, 0x0a, - 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, - 0x0a, 0x15, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x12, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x07, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0xdb, 0x10, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x7c, 0x0a, 0x21, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x7a, 0x0a, 0x21, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, - 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1d, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, - 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, - 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, - 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, - 0x1c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, - 0x15, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, - 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x8b, 0x01, 0x0a, 0x26, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x23, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, - 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, - 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6d, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, + 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, - 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x21, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, - 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, + 0x00, 0x52, 0x1c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x58, 0x0a, 0x15, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, + 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x26, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x23, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x67, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x21, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x1d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, - 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6c, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, - 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, - 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x1a, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x1d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x5f, 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x14, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x90, 0x05, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x12, 0x50, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x3f, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, - 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, - 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x39, 0x0a, - 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, - 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, - 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, - 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x82, 0x01, 0x0a, 0x1e, 0x4d, 0x65, 0x74, 0x72, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x63, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6a, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x1a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x14, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x08, 0x0a, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xf8, 0x05, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0c, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x50, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, - 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8d, 0x01, 0x0a, - 0x1f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, - 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, - 0x72, 0x61, 0x69, 0x6e, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0xc7, 0x01, 0x0a, - 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x12, + 0x6f, 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x69, 0x6d, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, + 0x73, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, + 0x64, 0x12, 0x31, 0x0a, 0x05, 0x77, 0x68, 0x65, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, + 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, + 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x22, 0x82, 0x01, 0x0a, 0x1e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8d, 0x01, 0x0a, 0x1f, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, + 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0f, + 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, + 0x6e, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x62, 0x75, + 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x41, 0x72, 0x67, 0x73, + 0x22, 0x44, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x65, - 0x61, 0x73, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, - 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x62, 0x75, - 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x48, 0x0a, 0x14, - 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, - 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, - 0x72, 0x65, 0x41, 0x72, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0xcf, 0x04, 0x0a, - 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2e, 0x0a, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0d, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, - 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, - 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, - 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, - 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x12, 0x34, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0xb7, 0x05, 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x0e, 0x64, 0x69, + 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, 0x69, 0x6d, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, + 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, + 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x04, 0x73, 0x6f, + 0x72, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, + 0x12, 0x31, 0x0a, 0x05, 0x77, 0x68, 0x65, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x22, 0x81, 0x01, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0xbf, 0x06, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x64, + 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x53, 0x6f, 0x72, 0x74, - 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x81, - 0x01, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, - 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x09, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x6d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x08, 0x6d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, + 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x4e, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x13, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x77, 0x68, 0x65, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x4c, 0x0a, 0x07, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x89, 0x05, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x64, 0x69, 0x6d, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, - 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x6d, 0x65, 0x61, - 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x61, 0x63, 0x74, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x65, 0x78, 0x61, 0x63, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x5e, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x6f, 0x77, + 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x8c, 0x02, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x03, 0x65, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x6f, 0x5f, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x73, 0x6f, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x6f, 0x5f, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x73, 0x6f, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x74, 0x6f, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x6f, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, + 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, + 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x73, 0x6f, 0x72, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x61, - 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x52, - 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x4e, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x13, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, + 0x73, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x18, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x52, 0x6f, 0x77, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, + 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x6d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x1a, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0a, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, + 0x61, 0x62, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x41, 0x62, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, 0x6c, + 0x22, 0x94, 0x01, 0x0a, 0x21, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, + 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x82, 0x05, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, + 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, + 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, + 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x0f, + 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x31, 0x0a, 0x05, 0x77, 0x68, 0x65, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x06, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, + 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x22, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x22, 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x61, 0x63, - 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x65, 0x78, 0x61, 0x63, 0x74, 0x22, 0x5e, - 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3d, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, - 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x8c, - 0x02, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, - 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x69, 0x73, 0x6f, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x69, 0x73, 0x6f, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x6f, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x73, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x40, - 0x0a, 0x0e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, - 0x69, 0x6e, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6f, 0x47, 0x72, 0x61, 0x69, 0x6e, - 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0x90, 0x01, - 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x42, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, - 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0xaf, 0x01, 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x6f, 0x77, 0x12, 0x3f, 0x0a, - 0x0f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, - 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, - 0x0a, 0x0e, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, - 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x61, 0x62, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x74, 0x61, - 0x41, 0x62, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, - 0x64, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, 0x6c, 0x22, 0x9a, 0x04, 0x0a, 0x1c, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, + 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x8d, 0x01, 0x0a, + 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, + 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe5, 0x03, 0x0a, + 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, @@ -6391,175 +6696,174 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, - 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x77, 0x68, 0x65, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, - 0x34, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb2, 0x03, 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc5, 0x04, 0x0a, 0x16, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, - 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, - 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, + 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x31, 0x0a, 0x05, 0x77, 0x68, 0x65, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x80, 0x01, 0x0a, 0x19, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, - 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x92, 0x04, - 0x0a, 0x16, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, - 0x12, 0x45, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x6e, - 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x53, - 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, - 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, - 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, - 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, - 0x6e, 0x65, 0x22, 0x7e, 0x0a, 0x17, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x22, 0xf1, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, + 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, + 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, + 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, + 0x6f, 0x6e, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, + 0x7e, 0x0a, 0x17, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, + 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x4c, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x53, 0x6f, + 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xf1, 0x01, + 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x52, 0x07, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x64, - 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x43, - 0x6f, 0x6e, 0x64, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x1a, 0x56, 0x0a, 0x04, - 0x43, 0x6f, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, - 0x6c, 0x69, 0x6b, 0x65, 0x22, 0x57, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x55, 0x0a, - 0x0d, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x1b, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0a, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x1b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x1a, 0x56, 0x0a, 0x04, 0x43, 0x6f, 0x6e, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6b, + 0x65, 0x22, 0x57, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x55, 0x0a, 0x0d, 0x49, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x1b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, + 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x22, 0x6f, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x22, 0xac, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, + 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6f, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xac, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xb6, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, - 0xc2, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x22, 0xb6, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, + 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x03, 0x65, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, + 0x69, 0x6e, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xc2, 0x01, 0x0a, + 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x61, 0x67, 0x67, 0x12, 0x0c, 0x0a, 0x01, 0x6b, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x01, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x22, 0x6a, 0x0a, 0x12, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, + 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x6e, 0x0a, + 0x12, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4b, 0x48, 0x00, 0x52, 0x04, 0x74, 0x6f, 0x70, + 0x4b, 0x12, 0x22, 0x0a, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x22, 0x8a, 0x01, + 0x0a, 0x04, 0x54, 0x6f, 0x70, 0x4b, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4b, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x4b, 0x0a, + 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, @@ -6567,35 +6871,124 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x67, 0x67, 0x12, 0x0c, 0x0a, 0x01, 0x6b, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, 0x0a, 0x12, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, - 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, 0x63, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0x6e, 0x0a, 0x12, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4b, 0x48, 0x00, 0x52, 0x04, - 0x74, 0x6f, 0x70, 0x4b, 0x12, 0x22, 0x0a, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x61, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, - 0x22, 0x8a, 0x01, 0x0a, 0x04, 0x54, 0x6f, 0x70, 0x4b, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, - 0x4b, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x1a, 0x4b, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa7, 0x01, - 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, + 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x22, 0x2f, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, + 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x22, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, + 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6f, 0x0a, 0x23, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x9b, 0x02, 0x0a, + 0x0e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x5d, 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x62, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x12, 0x53, + 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x48, 0x00, + 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6f, + 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x48, + 0x00, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, + 0x72, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x14, 0x4e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, + 0x69, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x04, 0x62, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x2e, 0x42, 0x69, 0x6e, 0x52, 0x04, 0x62, 0x69, + 0x6e, 0x73, 0x1a, 0x75, 0x0a, 0x03, 0x42, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, + 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x69, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x68, + 0x69, 0x67, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x4e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x69, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, + 0x6d, 0x61, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x04, 0x6d, 0x65, 0x61, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x32, 0x35, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x35, 0x30, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x71, + 0x37, 0x35, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x37, 0x35, 0x12, 0x0e, 0x0a, + 0x02, 0x73, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x73, 0x64, 0x22, 0xd0, 0x01, + 0x0a, 0x0f, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, + 0x73, 0x12, 0x44, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, + 0x6c, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x52, 0x08, 0x6f, + 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x77, 0x0a, 0x07, 0x4f, 0x75, 0x74, 0x6c, 0x69, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, + 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x69, 0x67, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, + 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x54, 0x0a, 0x17, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, + 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, + 0x22, 0xfb, 0x01, 0x0a, 0x1d, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x52, 0x0f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, + 0x0a, 0x1e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xaa, 0x01, 0x0a, 0x19, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, @@ -6604,122 +6997,49 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x2f, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x22, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6f, - 0x0a, 0x23, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x66, 0x0a, 0x1a, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, - 0x9b, 0x02, 0x0a, 0x0e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x5d, 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x62, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6e, 0x75, 0x6d, - 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, - 0x73, 0x12, 0x53, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x5f, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, - 0x72, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, - 0x6c, 0x69, 0x65, 0x72, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x22, 0xcc, 0x01, - 0x0a, 0x14, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x04, 0x62, 0x69, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x2e, 0x42, 0x69, 0x6e, 0x52, - 0x04, 0x62, 0x69, 0x6e, 0x73, 0x1a, 0x75, 0x0a, 0x03, 0x42, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x69, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, - 0x11, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x61, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x65, 0x61, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x32, - 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x71, 0x35, 0x30, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x35, 0x30, 0x12, 0x10, - 0x0a, 0x03, 0x71, 0x37, 0x35, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x37, 0x35, - 0x12, 0x0e, 0x0a, 0x02, 0x73, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x73, 0x64, - 0x22, 0xd0, 0x01, 0x0a, 0x0f, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, - 0x69, 0x65, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, - 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, - 0x52, 0x08, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x77, 0x0a, 0x07, 0x4f, 0x75, - 0x74, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, - 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x68, - 0x69, 0x67, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x54, 0x0a, - 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, - 0x61, 0x69, 0x6e, 0x22, 0xfb, 0x01, 0x0a, 0x1d, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x22, 0x6a, 0x0a, 0x1e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, - 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, - 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xaa, 0x01, - 0x0a, 0x19, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, 0x0a, 0x17, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x86, 0x02, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x69, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x46, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x1a, 0x4e, + 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x22, 0xa9, + 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, @@ -6728,207 +7048,175 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x66, 0x0a, 0x1a, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, - 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, 0x0a, 0x17, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x86, 0x02, 0x0a, 0x10, 0x54, 0x69, 0x6d, - 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2c, 0x0a, - 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x03, 0x6d, - 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x71, 0x0a, 0x19, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, + 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xa9, 0x04, + 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, + 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x3b, 0x0a, 0x15, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x0a, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, 0x6d, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x1f, 0x0a, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, + 0x52, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, + 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x1a, 0x62, 0x0a, 0x0c, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x71, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x57, 0x0a, 0x18, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x6c, + 0x75, 0x70, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, + 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xa9, 0x01, 0x0a, + 0x12, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x36, 0x0a, 0x05, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x0f, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, 0x02, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x46, 0x0a, 0x08, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x1a, 0x4e, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, - 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x69, 0x63, 0x72, 0x6f, - 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x71, 0x0a, - 0x19, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, 0x63, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0xa9, 0x04, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, - 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x15, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x13, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x43, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x06, 0x70, - 0x69, 0x78, 0x65, 0x6c, 0x73, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, - 0x02, 0x28, 0x00, 0x52, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x1a, 0x62, 0x0a, 0x0c, 0x42, 0x61, 0x73, 0x69, - 0x63, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x71, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x57, 0x0a, 0x18, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x6f, 0x6c, 0x6c, - 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x72, - 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, - 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, - 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, - 0xa9, 0x01, 0x0a, 0x12, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x0f, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x62, - 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x62, 0x69, 0x6e, 0x12, 0x31, 0x0a, - 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, - 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x22, 0x3c, 0x0a, 0x18, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x7a, - 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x5f, 0x0a, 0x14, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0x6b, 0x0a, 0x0d, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x5f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x13, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x96, 0x01, 0x0a, 0x10, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x22, 0x40, 0x0a, 0x11, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x2a, 0x70, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, - 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, - 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, - 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, - 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x41, - 0x53, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x49, - 0x4e, 0x43, 0x54, 0x10, 0x02, 0x2a, 0x9e, 0x02, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, - 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x2d, 0x4d, 0x45, 0x54, 0x52, 0x49, - 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, - 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x45, - 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, - 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x42, 0x41, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x01, 0x12, 0x36, 0x0a, 0x32, - 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, - 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x4c, - 0x55, 0x45, 0x10, 0x02, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x69, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x62, 0x69, 0x6e, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x7e, 0x0a, + 0x17, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3c, 0x0a, + 0x18, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, + 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x7a, 0x0a, 0x13, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x5f, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0x6b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x13, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x96, 0x01, 0x0a, 0x10, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x40, + 0x0a, 0x11, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x2a, 0x70, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x4d, 0x45, + 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x4d, + 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x22, + 0x0a, 0x1e, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, + 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x49, 0x4e, 0x43, 0x54, + 0x10, 0x02, 0x2a, 0x9e, 0x02, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x2d, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, - 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x42, 0x53, 0x5f, 0x44, 0x45, - 0x4c, 0x54, 0x41, 0x10, 0x03, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, - 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, - 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x5f, 0x44, + 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, + 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, + 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x01, 0x12, 0x36, 0x0a, 0x32, 0x4d, 0x45, 0x54, + 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, + 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, + 0x02, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, + 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x42, 0x53, 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, + 0x10, 0x03, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, + 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, + 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x4c, 0x54, + 0x41, 0x10, 0x04, 0x2a, 0xb0, 0x02, 0x0a, 0x20, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x30, 0x4d, 0x45, 0x54, 0x52, + 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, + 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x33, + 0x0a, 0x2f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, + 0x45, 0x10, 0x01, 0x12, 0x39, 0x0a, 0x35, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, + 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, + 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, + 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x32, + 0x0a, 0x2e, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x42, 0x53, 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, + 0x10, 0x03, 0x12, 0x32, 0x0a, 0x2e, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, + 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x45, + 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x10, 0x04, 0x2a, 0x6d, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, @@ -7232,286 +7520,302 @@ func file_rill_runtime_v1_queries_proto_rawDescGZIP() []byte { return file_rill_runtime_v1_queries_proto_rawDescData } -var file_rill_runtime_v1_queries_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_rill_runtime_v1_queries_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_rill_runtime_v1_queries_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_rill_runtime_v1_queries_proto_msgTypes = make([]protoimpl.MessageInfo, 77) var file_rill_runtime_v1_queries_proto_goTypes = []interface{}{ (BuiltinMeasure)(0), // 0: rill.runtime.v1.BuiltinMeasure (MetricsViewComparisonSortType)(0), // 1: rill.runtime.v1.MetricsViewComparisonSortType - (HistogramMethod)(0), // 2: rill.runtime.v1.HistogramMethod - (*QueryRequest)(nil), // 3: rill.runtime.v1.QueryRequest - (*QueryResponse)(nil), // 4: rill.runtime.v1.QueryResponse - (*QueryBatchRequest)(nil), // 5: rill.runtime.v1.QueryBatchRequest - (*QueryBatchResponse)(nil), // 6: rill.runtime.v1.QueryBatchResponse - (*ExportRequest)(nil), // 7: rill.runtime.v1.ExportRequest - (*ExportResponse)(nil), // 8: rill.runtime.v1.ExportResponse - (*Query)(nil), // 9: rill.runtime.v1.Query - (*QueryResult)(nil), // 10: rill.runtime.v1.QueryResult - (*MetricsViewAggregationRequest)(nil), // 11: rill.runtime.v1.MetricsViewAggregationRequest - (*MetricsViewAggregationResponse)(nil), // 12: rill.runtime.v1.MetricsViewAggregationResponse - (*MetricsViewAggregationDimension)(nil), // 13: rill.runtime.v1.MetricsViewAggregationDimension - (*MetricsViewAggregationMeasure)(nil), // 14: rill.runtime.v1.MetricsViewAggregationMeasure - (*MetricsViewAggregationSort)(nil), // 15: rill.runtime.v1.MetricsViewAggregationSort - (*MetricsViewToplistRequest)(nil), // 16: rill.runtime.v1.MetricsViewToplistRequest - (*MetricsViewToplistResponse)(nil), // 17: rill.runtime.v1.MetricsViewToplistResponse - (*MetricsViewComparisonRequest)(nil), // 18: rill.runtime.v1.MetricsViewComparisonRequest - (*MetricsViewComparisonResponse)(nil), // 19: rill.runtime.v1.MetricsViewComparisonResponse - (*TimeRange)(nil), // 20: rill.runtime.v1.TimeRange - (*MetricsViewComparisonSort)(nil), // 21: rill.runtime.v1.MetricsViewComparisonSort - (*MetricsViewComparisonRow)(nil), // 22: rill.runtime.v1.MetricsViewComparisonRow - (*MetricsViewComparisonValue)(nil), // 23: rill.runtime.v1.MetricsViewComparisonValue - (*MetricsViewTimeSeriesRequest)(nil), // 24: rill.runtime.v1.MetricsViewTimeSeriesRequest - (*MetricsViewTimeSeriesResponse)(nil), // 25: rill.runtime.v1.MetricsViewTimeSeriesResponse - (*MetricsViewTotalsRequest)(nil), // 26: rill.runtime.v1.MetricsViewTotalsRequest - (*MetricsViewTotalsResponse)(nil), // 27: rill.runtime.v1.MetricsViewTotalsResponse - (*MetricsViewRowsRequest)(nil), // 28: rill.runtime.v1.MetricsViewRowsRequest - (*MetricsViewRowsResponse)(nil), // 29: rill.runtime.v1.MetricsViewRowsResponse - (*MetricsViewSort)(nil), // 30: rill.runtime.v1.MetricsViewSort - (*MetricsViewFilter)(nil), // 31: rill.runtime.v1.MetricsViewFilter - (*MetricsViewColumn)(nil), // 32: rill.runtime.v1.MetricsViewColumn - (*InlineMeasure)(nil), // 33: rill.runtime.v1.InlineMeasure - (*MetricsViewTimeRangeRequest)(nil), // 34: rill.runtime.v1.MetricsViewTimeRangeRequest - (*MetricsViewTimeRangeResponse)(nil), // 35: rill.runtime.v1.MetricsViewTimeRangeResponse - (*ColumnRollupIntervalRequest)(nil), // 36: rill.runtime.v1.ColumnRollupIntervalRequest - (*ColumnRollupIntervalResponse)(nil), // 37: rill.runtime.v1.ColumnRollupIntervalResponse - (*ColumnTopKRequest)(nil), // 38: rill.runtime.v1.ColumnTopKRequest - (*ColumnTopKResponse)(nil), // 39: rill.runtime.v1.ColumnTopKResponse - (*CategoricalSummary)(nil), // 40: rill.runtime.v1.CategoricalSummary - (*TopK)(nil), // 41: rill.runtime.v1.TopK - (*ColumnNullCountRequest)(nil), // 42: rill.runtime.v1.ColumnNullCountRequest - (*ColumnNullCountResponse)(nil), // 43: rill.runtime.v1.ColumnNullCountResponse - (*ColumnDescriptiveStatisticsRequest)(nil), // 44: rill.runtime.v1.ColumnDescriptiveStatisticsRequest - (*ColumnDescriptiveStatisticsResponse)(nil), // 45: rill.runtime.v1.ColumnDescriptiveStatisticsResponse - (*NumericSummary)(nil), // 46: rill.runtime.v1.NumericSummary - (*NumericHistogramBins)(nil), // 47: rill.runtime.v1.NumericHistogramBins - (*NumericStatistics)(nil), // 48: rill.runtime.v1.NumericStatistics - (*NumericOutliers)(nil), // 49: rill.runtime.v1.NumericOutliers - (*ColumnTimeGrainRequest)(nil), // 50: rill.runtime.v1.ColumnTimeGrainRequest - (*ColumnTimeGrainResponse)(nil), // 51: rill.runtime.v1.ColumnTimeGrainResponse - (*ColumnNumericHistogramRequest)(nil), // 52: rill.runtime.v1.ColumnNumericHistogramRequest - (*ColumnNumericHistogramResponse)(nil), // 53: rill.runtime.v1.ColumnNumericHistogramResponse - (*ColumnRugHistogramRequest)(nil), // 54: rill.runtime.v1.ColumnRugHistogramRequest - (*ColumnRugHistogramResponse)(nil), // 55: rill.runtime.v1.ColumnRugHistogramResponse - (*ColumnTimeRangeRequest)(nil), // 56: rill.runtime.v1.ColumnTimeRangeRequest - (*ColumnTimeRangeResponse)(nil), // 57: rill.runtime.v1.ColumnTimeRangeResponse - (*TimeRangeSummary)(nil), // 58: rill.runtime.v1.TimeRangeSummary - (*ColumnCardinalityRequest)(nil), // 59: rill.runtime.v1.ColumnCardinalityRequest - (*ColumnCardinalityResponse)(nil), // 60: rill.runtime.v1.ColumnCardinalityResponse - (*ColumnTimeSeriesRequest)(nil), // 61: rill.runtime.v1.ColumnTimeSeriesRequest - (*ColumnTimeSeriesResponse)(nil), // 62: rill.runtime.v1.ColumnTimeSeriesResponse - (*TimeSeriesTimeRange)(nil), // 63: rill.runtime.v1.TimeSeriesTimeRange - (*TimeSeriesResponse)(nil), // 64: rill.runtime.v1.TimeSeriesResponse - (*TimeSeriesValue)(nil), // 65: rill.runtime.v1.TimeSeriesValue - (*TableCardinalityRequest)(nil), // 66: rill.runtime.v1.TableCardinalityRequest - (*TableCardinalityResponse)(nil), // 67: rill.runtime.v1.TableCardinalityResponse - (*TableColumnsRequest)(nil), // 68: rill.runtime.v1.TableColumnsRequest - (*TableColumnsResponse)(nil), // 69: rill.runtime.v1.TableColumnsResponse - (*ProfileColumn)(nil), // 70: rill.runtime.v1.ProfileColumn - (*TableRowsRequest)(nil), // 71: rill.runtime.v1.TableRowsRequest - (*TableRowsResponse)(nil), // 72: rill.runtime.v1.TableRowsResponse - (*MetricsViewFilter_Cond)(nil), // 73: rill.runtime.v1.MetricsViewFilter.Cond - (*TopK_Entry)(nil), // 74: rill.runtime.v1.TopK.Entry - (*NumericHistogramBins_Bin)(nil), // 75: rill.runtime.v1.NumericHistogramBins.Bin - (*NumericOutliers_Outlier)(nil), // 76: rill.runtime.v1.NumericOutliers.Outlier - (*TimeRangeSummary_Interval)(nil), // 77: rill.runtime.v1.TimeRangeSummary.Interval - (*ColumnTimeSeriesRequest_BasicMeasure)(nil), // 78: rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure - (*structpb.Value)(nil), // 79: google.protobuf.Value - (*StructType)(nil), // 80: rill.runtime.v1.StructType - (*structpb.Struct)(nil), // 81: google.protobuf.Struct - (ExportFormat)(0), // 82: rill.runtime.v1.ExportFormat - (*timestamppb.Timestamp)(nil), // 83: google.protobuf.Timestamp - (TimeGrain)(0), // 84: rill.runtime.v1.TimeGrain + (MetricsViewComparisonMeasureType)(0), // 2: rill.runtime.v1.MetricsViewComparisonMeasureType + (HistogramMethod)(0), // 3: rill.runtime.v1.HistogramMethod + (*QueryRequest)(nil), // 4: rill.runtime.v1.QueryRequest + (*QueryResponse)(nil), // 5: rill.runtime.v1.QueryResponse + (*QueryBatchRequest)(nil), // 6: rill.runtime.v1.QueryBatchRequest + (*QueryBatchResponse)(nil), // 7: rill.runtime.v1.QueryBatchResponse + (*ExportRequest)(nil), // 8: rill.runtime.v1.ExportRequest + (*ExportResponse)(nil), // 9: rill.runtime.v1.ExportResponse + (*Query)(nil), // 10: rill.runtime.v1.Query + (*QueryResult)(nil), // 11: rill.runtime.v1.QueryResult + (*MetricsViewAggregationRequest)(nil), // 12: rill.runtime.v1.MetricsViewAggregationRequest + (*MetricsViewAggregationResponse)(nil), // 13: rill.runtime.v1.MetricsViewAggregationResponse + (*MetricsViewAggregationDimension)(nil), // 14: rill.runtime.v1.MetricsViewAggregationDimension + (*MetricsViewAggregationMeasure)(nil), // 15: rill.runtime.v1.MetricsViewAggregationMeasure + (*MetricsViewAggregationSort)(nil), // 16: rill.runtime.v1.MetricsViewAggregationSort + (*MetricsViewToplistRequest)(nil), // 17: rill.runtime.v1.MetricsViewToplistRequest + (*MetricsViewToplistResponse)(nil), // 18: rill.runtime.v1.MetricsViewToplistResponse + (*MetricsViewComparisonRequest)(nil), // 19: rill.runtime.v1.MetricsViewComparisonRequest + (*MetricsViewComparisonResponse)(nil), // 20: rill.runtime.v1.MetricsViewComparisonResponse + (*TimeRange)(nil), // 21: rill.runtime.v1.TimeRange + (*MetricsViewComparisonSort)(nil), // 22: rill.runtime.v1.MetricsViewComparisonSort + (*MetricsViewComparisonRow)(nil), // 23: rill.runtime.v1.MetricsViewComparisonRow + (*MetricsViewComparisonValue)(nil), // 24: rill.runtime.v1.MetricsViewComparisonValue + (*MetricsViewComparisonMeasureAlias)(nil), // 25: rill.runtime.v1.MetricsViewComparisonMeasureAlias + (*MetricsViewTimeSeriesRequest)(nil), // 26: rill.runtime.v1.MetricsViewTimeSeriesRequest + (*MetricsViewTimeSeriesResponse)(nil), // 27: rill.runtime.v1.MetricsViewTimeSeriesResponse + (*MetricsViewTotalsRequest)(nil), // 28: rill.runtime.v1.MetricsViewTotalsRequest + (*MetricsViewTotalsResponse)(nil), // 29: rill.runtime.v1.MetricsViewTotalsResponse + (*MetricsViewRowsRequest)(nil), // 30: rill.runtime.v1.MetricsViewRowsRequest + (*MetricsViewRowsResponse)(nil), // 31: rill.runtime.v1.MetricsViewRowsResponse + (*MetricsViewSort)(nil), // 32: rill.runtime.v1.MetricsViewSort + (*MetricsViewFilter)(nil), // 33: rill.runtime.v1.MetricsViewFilter + (*MetricsViewColumn)(nil), // 34: rill.runtime.v1.MetricsViewColumn + (*InlineMeasure)(nil), // 35: rill.runtime.v1.InlineMeasure + (*MetricsViewTimeRangeRequest)(nil), // 36: rill.runtime.v1.MetricsViewTimeRangeRequest + (*MetricsViewTimeRangeResponse)(nil), // 37: rill.runtime.v1.MetricsViewTimeRangeResponse + (*ColumnRollupIntervalRequest)(nil), // 38: rill.runtime.v1.ColumnRollupIntervalRequest + (*ColumnRollupIntervalResponse)(nil), // 39: rill.runtime.v1.ColumnRollupIntervalResponse + (*ColumnTopKRequest)(nil), // 40: rill.runtime.v1.ColumnTopKRequest + (*ColumnTopKResponse)(nil), // 41: rill.runtime.v1.ColumnTopKResponse + (*CategoricalSummary)(nil), // 42: rill.runtime.v1.CategoricalSummary + (*TopK)(nil), // 43: rill.runtime.v1.TopK + (*ColumnNullCountRequest)(nil), // 44: rill.runtime.v1.ColumnNullCountRequest + (*ColumnNullCountResponse)(nil), // 45: rill.runtime.v1.ColumnNullCountResponse + (*ColumnDescriptiveStatisticsRequest)(nil), // 46: rill.runtime.v1.ColumnDescriptiveStatisticsRequest + (*ColumnDescriptiveStatisticsResponse)(nil), // 47: rill.runtime.v1.ColumnDescriptiveStatisticsResponse + (*NumericSummary)(nil), // 48: rill.runtime.v1.NumericSummary + (*NumericHistogramBins)(nil), // 49: rill.runtime.v1.NumericHistogramBins + (*NumericStatistics)(nil), // 50: rill.runtime.v1.NumericStatistics + (*NumericOutliers)(nil), // 51: rill.runtime.v1.NumericOutliers + (*ColumnTimeGrainRequest)(nil), // 52: rill.runtime.v1.ColumnTimeGrainRequest + (*ColumnTimeGrainResponse)(nil), // 53: rill.runtime.v1.ColumnTimeGrainResponse + (*ColumnNumericHistogramRequest)(nil), // 54: rill.runtime.v1.ColumnNumericHistogramRequest + (*ColumnNumericHistogramResponse)(nil), // 55: rill.runtime.v1.ColumnNumericHistogramResponse + (*ColumnRugHistogramRequest)(nil), // 56: rill.runtime.v1.ColumnRugHistogramRequest + (*ColumnRugHistogramResponse)(nil), // 57: rill.runtime.v1.ColumnRugHistogramResponse + (*ColumnTimeRangeRequest)(nil), // 58: rill.runtime.v1.ColumnTimeRangeRequest + (*ColumnTimeRangeResponse)(nil), // 59: rill.runtime.v1.ColumnTimeRangeResponse + (*TimeRangeSummary)(nil), // 60: rill.runtime.v1.TimeRangeSummary + (*ColumnCardinalityRequest)(nil), // 61: rill.runtime.v1.ColumnCardinalityRequest + (*ColumnCardinalityResponse)(nil), // 62: rill.runtime.v1.ColumnCardinalityResponse + (*ColumnTimeSeriesRequest)(nil), // 63: rill.runtime.v1.ColumnTimeSeriesRequest + (*ColumnTimeSeriesResponse)(nil), // 64: rill.runtime.v1.ColumnTimeSeriesResponse + (*TimeSeriesTimeRange)(nil), // 65: rill.runtime.v1.TimeSeriesTimeRange + (*TimeSeriesResponse)(nil), // 66: rill.runtime.v1.TimeSeriesResponse + (*TimeSeriesValue)(nil), // 67: rill.runtime.v1.TimeSeriesValue + (*TableCardinalityRequest)(nil), // 68: rill.runtime.v1.TableCardinalityRequest + (*TableCardinalityResponse)(nil), // 69: rill.runtime.v1.TableCardinalityResponse + (*TableColumnsRequest)(nil), // 70: rill.runtime.v1.TableColumnsRequest + (*TableColumnsResponse)(nil), // 71: rill.runtime.v1.TableColumnsResponse + (*ProfileColumn)(nil), // 72: rill.runtime.v1.ProfileColumn + (*TableRowsRequest)(nil), // 73: rill.runtime.v1.TableRowsRequest + (*TableRowsResponse)(nil), // 74: rill.runtime.v1.TableRowsResponse + (*MetricsViewFilter_Cond)(nil), // 75: rill.runtime.v1.MetricsViewFilter.Cond + (*TopK_Entry)(nil), // 76: rill.runtime.v1.TopK.Entry + (*NumericHistogramBins_Bin)(nil), // 77: rill.runtime.v1.NumericHistogramBins.Bin + (*NumericOutliers_Outlier)(nil), // 78: rill.runtime.v1.NumericOutliers.Outlier + (*TimeRangeSummary_Interval)(nil), // 79: rill.runtime.v1.TimeRangeSummary.Interval + (*ColumnTimeSeriesRequest_BasicMeasure)(nil), // 80: rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure + (*structpb.Value)(nil), // 81: google.protobuf.Value + (*StructType)(nil), // 82: rill.runtime.v1.StructType + (*structpb.Struct)(nil), // 83: google.protobuf.Struct + (ExportFormat)(0), // 84: rill.runtime.v1.ExportFormat + (*timestamppb.Timestamp)(nil), // 85: google.protobuf.Timestamp + (*Expression)(nil), // 86: rill.runtime.v1.Expression + (TimeGrain)(0), // 87: rill.runtime.v1.TimeGrain } var file_rill_runtime_v1_queries_proto_depIdxs = []int32{ - 79, // 0: rill.runtime.v1.QueryRequest.args:type_name -> google.protobuf.Value - 80, // 1: rill.runtime.v1.QueryResponse.meta:type_name -> rill.runtime.v1.StructType - 81, // 2: rill.runtime.v1.QueryResponse.data:type_name -> google.protobuf.Struct - 9, // 3: rill.runtime.v1.QueryBatchRequest.queries:type_name -> rill.runtime.v1.Query - 10, // 4: rill.runtime.v1.QueryBatchResponse.result:type_name -> rill.runtime.v1.QueryResult - 82, // 5: rill.runtime.v1.ExportRequest.format:type_name -> rill.runtime.v1.ExportFormat - 9, // 6: rill.runtime.v1.ExportRequest.query:type_name -> rill.runtime.v1.Query - 11, // 7: rill.runtime.v1.Query.metrics_view_aggregation_request:type_name -> rill.runtime.v1.MetricsViewAggregationRequest - 16, // 8: rill.runtime.v1.Query.metrics_view_toplist_request:type_name -> rill.runtime.v1.MetricsViewToplistRequest - 18, // 9: rill.runtime.v1.Query.metrics_view_comparison_request:type_name -> rill.runtime.v1.MetricsViewComparisonRequest - 24, // 10: rill.runtime.v1.Query.metrics_view_time_series_request:type_name -> rill.runtime.v1.MetricsViewTimeSeriesRequest - 26, // 11: rill.runtime.v1.Query.metrics_view_totals_request:type_name -> rill.runtime.v1.MetricsViewTotalsRequest - 28, // 12: rill.runtime.v1.Query.metrics_view_rows_request:type_name -> rill.runtime.v1.MetricsViewRowsRequest - 36, // 13: rill.runtime.v1.Query.column_rollup_interval_request:type_name -> rill.runtime.v1.ColumnRollupIntervalRequest - 38, // 14: rill.runtime.v1.Query.column_top_k_request:type_name -> rill.runtime.v1.ColumnTopKRequest - 42, // 15: rill.runtime.v1.Query.column_null_count_request:type_name -> rill.runtime.v1.ColumnNullCountRequest - 44, // 16: rill.runtime.v1.Query.column_descriptive_statistics_request:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest - 50, // 17: rill.runtime.v1.Query.column_time_grain_request:type_name -> rill.runtime.v1.ColumnTimeGrainRequest - 52, // 18: rill.runtime.v1.Query.column_numeric_histogram_request:type_name -> rill.runtime.v1.ColumnNumericHistogramRequest - 54, // 19: rill.runtime.v1.Query.column_rug_histogram_request:type_name -> rill.runtime.v1.ColumnRugHistogramRequest - 56, // 20: rill.runtime.v1.Query.column_time_range_request:type_name -> rill.runtime.v1.ColumnTimeRangeRequest - 59, // 21: rill.runtime.v1.Query.column_cardinality_request:type_name -> rill.runtime.v1.ColumnCardinalityRequest - 61, // 22: rill.runtime.v1.Query.column_time_series_request:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest - 66, // 23: rill.runtime.v1.Query.table_cardinality_request:type_name -> rill.runtime.v1.TableCardinalityRequest - 68, // 24: rill.runtime.v1.Query.table_columns_request:type_name -> rill.runtime.v1.TableColumnsRequest - 71, // 25: rill.runtime.v1.Query.table_rows_request:type_name -> rill.runtime.v1.TableRowsRequest - 12, // 26: rill.runtime.v1.QueryResult.metrics_view_aggregation_response:type_name -> rill.runtime.v1.MetricsViewAggregationResponse - 17, // 27: rill.runtime.v1.QueryResult.metrics_view_toplist_response:type_name -> rill.runtime.v1.MetricsViewToplistResponse - 19, // 28: rill.runtime.v1.QueryResult.metrics_view_comparison_response:type_name -> rill.runtime.v1.MetricsViewComparisonResponse - 25, // 29: rill.runtime.v1.QueryResult.metrics_view_time_series_response:type_name -> rill.runtime.v1.MetricsViewTimeSeriesResponse - 27, // 30: rill.runtime.v1.QueryResult.metrics_view_totals_response:type_name -> rill.runtime.v1.MetricsViewTotalsResponse - 29, // 31: rill.runtime.v1.QueryResult.metrics_view_rows_response:type_name -> rill.runtime.v1.MetricsViewRowsResponse - 37, // 32: rill.runtime.v1.QueryResult.column_rollup_interval_response:type_name -> rill.runtime.v1.ColumnRollupIntervalResponse - 39, // 33: rill.runtime.v1.QueryResult.column_top_k_response:type_name -> rill.runtime.v1.ColumnTopKResponse - 43, // 34: rill.runtime.v1.QueryResult.column_null_count_response:type_name -> rill.runtime.v1.ColumnNullCountResponse - 45, // 35: rill.runtime.v1.QueryResult.column_descriptive_statistics_response:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse - 51, // 36: rill.runtime.v1.QueryResult.column_time_grain_response:type_name -> rill.runtime.v1.ColumnTimeGrainResponse - 53, // 37: rill.runtime.v1.QueryResult.column_numeric_histogram_response:type_name -> rill.runtime.v1.ColumnNumericHistogramResponse - 55, // 38: rill.runtime.v1.QueryResult.column_rug_histogram_response:type_name -> rill.runtime.v1.ColumnRugHistogramResponse - 57, // 39: rill.runtime.v1.QueryResult.column_time_range_response:type_name -> rill.runtime.v1.ColumnTimeRangeResponse - 60, // 40: rill.runtime.v1.QueryResult.column_cardinality_response:type_name -> rill.runtime.v1.ColumnCardinalityResponse - 62, // 41: rill.runtime.v1.QueryResult.column_time_series_response:type_name -> rill.runtime.v1.ColumnTimeSeriesResponse - 67, // 42: rill.runtime.v1.QueryResult.table_cardinality_response:type_name -> rill.runtime.v1.TableCardinalityResponse - 69, // 43: rill.runtime.v1.QueryResult.table_columns_response:type_name -> rill.runtime.v1.TableColumnsResponse - 72, // 44: rill.runtime.v1.QueryResult.table_rows_response:type_name -> rill.runtime.v1.TableRowsResponse - 13, // 45: rill.runtime.v1.MetricsViewAggregationRequest.dimensions:type_name -> rill.runtime.v1.MetricsViewAggregationDimension - 14, // 46: rill.runtime.v1.MetricsViewAggregationRequest.measures:type_name -> rill.runtime.v1.MetricsViewAggregationMeasure - 15, // 47: rill.runtime.v1.MetricsViewAggregationRequest.sort:type_name -> rill.runtime.v1.MetricsViewAggregationSort - 20, // 48: rill.runtime.v1.MetricsViewAggregationRequest.time_range:type_name -> rill.runtime.v1.TimeRange - 83, // 49: rill.runtime.v1.MetricsViewAggregationRequest.time_start:type_name -> google.protobuf.Timestamp - 83, // 50: rill.runtime.v1.MetricsViewAggregationRequest.time_end:type_name -> google.protobuf.Timestamp - 31, // 51: rill.runtime.v1.MetricsViewAggregationRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 80, // 52: rill.runtime.v1.MetricsViewAggregationResponse.schema:type_name -> rill.runtime.v1.StructType - 81, // 53: rill.runtime.v1.MetricsViewAggregationResponse.data:type_name -> google.protobuf.Struct - 84, // 54: rill.runtime.v1.MetricsViewAggregationDimension.time_grain:type_name -> rill.runtime.v1.TimeGrain - 0, // 55: rill.runtime.v1.MetricsViewAggregationMeasure.builtin_measure:type_name -> rill.runtime.v1.BuiltinMeasure - 79, // 56: rill.runtime.v1.MetricsViewAggregationMeasure.builtin_measure_args:type_name -> google.protobuf.Value - 33, // 57: rill.runtime.v1.MetricsViewToplistRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure - 83, // 58: rill.runtime.v1.MetricsViewToplistRequest.time_start:type_name -> google.protobuf.Timestamp - 83, // 59: rill.runtime.v1.MetricsViewToplistRequest.time_end:type_name -> google.protobuf.Timestamp - 30, // 60: rill.runtime.v1.MetricsViewToplistRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort - 31, // 61: rill.runtime.v1.MetricsViewToplistRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 32, // 62: rill.runtime.v1.MetricsViewToplistResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 81, // 63: rill.runtime.v1.MetricsViewToplistResponse.data:type_name -> google.protobuf.Struct - 13, // 64: rill.runtime.v1.MetricsViewComparisonRequest.dimension:type_name -> rill.runtime.v1.MetricsViewAggregationDimension - 14, // 65: rill.runtime.v1.MetricsViewComparisonRequest.measures:type_name -> rill.runtime.v1.MetricsViewAggregationMeasure - 21, // 66: rill.runtime.v1.MetricsViewComparisonRequest.sort:type_name -> rill.runtime.v1.MetricsViewComparisonSort - 20, // 67: rill.runtime.v1.MetricsViewComparisonRequest.time_range:type_name -> rill.runtime.v1.TimeRange - 20, // 68: rill.runtime.v1.MetricsViewComparisonRequest.comparison_time_range:type_name -> rill.runtime.v1.TimeRange - 31, // 69: rill.runtime.v1.MetricsViewComparisonRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 22, // 70: rill.runtime.v1.MetricsViewComparisonResponse.rows:type_name -> rill.runtime.v1.MetricsViewComparisonRow - 83, // 71: rill.runtime.v1.TimeRange.start:type_name -> google.protobuf.Timestamp - 83, // 72: rill.runtime.v1.TimeRange.end:type_name -> google.protobuf.Timestamp - 84, // 73: rill.runtime.v1.TimeRange.round_to_grain:type_name -> rill.runtime.v1.TimeGrain - 1, // 74: rill.runtime.v1.MetricsViewComparisonSort.type:type_name -> rill.runtime.v1.MetricsViewComparisonSortType - 79, // 75: rill.runtime.v1.MetricsViewComparisonRow.dimension_value:type_name -> google.protobuf.Value - 23, // 76: rill.runtime.v1.MetricsViewComparisonRow.measure_values:type_name -> rill.runtime.v1.MetricsViewComparisonValue - 79, // 77: rill.runtime.v1.MetricsViewComparisonValue.base_value:type_name -> google.protobuf.Value - 79, // 78: rill.runtime.v1.MetricsViewComparisonValue.comparison_value:type_name -> google.protobuf.Value - 79, // 79: rill.runtime.v1.MetricsViewComparisonValue.delta_abs:type_name -> google.protobuf.Value - 79, // 80: rill.runtime.v1.MetricsViewComparisonValue.delta_rel:type_name -> google.protobuf.Value - 33, // 81: rill.runtime.v1.MetricsViewTimeSeriesRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure - 83, // 82: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_start:type_name -> google.protobuf.Timestamp - 83, // 83: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_end:type_name -> google.protobuf.Timestamp - 84, // 84: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain - 31, // 85: rill.runtime.v1.MetricsViewTimeSeriesRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 32, // 86: rill.runtime.v1.MetricsViewTimeSeriesResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 65, // 87: rill.runtime.v1.MetricsViewTimeSeriesResponse.data:type_name -> rill.runtime.v1.TimeSeriesValue - 33, // 88: rill.runtime.v1.MetricsViewTotalsRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure - 83, // 89: rill.runtime.v1.MetricsViewTotalsRequest.time_start:type_name -> google.protobuf.Timestamp - 83, // 90: rill.runtime.v1.MetricsViewTotalsRequest.time_end:type_name -> google.protobuf.Timestamp - 31, // 91: rill.runtime.v1.MetricsViewTotalsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 32, // 92: rill.runtime.v1.MetricsViewTotalsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 81, // 93: rill.runtime.v1.MetricsViewTotalsResponse.data:type_name -> google.protobuf.Struct - 83, // 94: rill.runtime.v1.MetricsViewRowsRequest.time_start:type_name -> google.protobuf.Timestamp - 83, // 95: rill.runtime.v1.MetricsViewRowsRequest.time_end:type_name -> google.protobuf.Timestamp - 84, // 96: rill.runtime.v1.MetricsViewRowsRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain - 31, // 97: rill.runtime.v1.MetricsViewRowsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 30, // 98: rill.runtime.v1.MetricsViewRowsRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort - 32, // 99: rill.runtime.v1.MetricsViewRowsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 81, // 100: rill.runtime.v1.MetricsViewRowsResponse.data:type_name -> google.protobuf.Struct - 73, // 101: rill.runtime.v1.MetricsViewFilter.include:type_name -> rill.runtime.v1.MetricsViewFilter.Cond - 73, // 102: rill.runtime.v1.MetricsViewFilter.exclude:type_name -> rill.runtime.v1.MetricsViewFilter.Cond - 58, // 103: rill.runtime.v1.MetricsViewTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary - 83, // 104: rill.runtime.v1.ColumnRollupIntervalResponse.start:type_name -> google.protobuf.Timestamp - 83, // 105: rill.runtime.v1.ColumnRollupIntervalResponse.end:type_name -> google.protobuf.Timestamp - 84, // 106: rill.runtime.v1.ColumnRollupIntervalResponse.interval:type_name -> rill.runtime.v1.TimeGrain - 40, // 107: rill.runtime.v1.ColumnTopKResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary - 41, // 108: rill.runtime.v1.CategoricalSummary.top_k:type_name -> rill.runtime.v1.TopK - 74, // 109: rill.runtime.v1.TopK.entries:type_name -> rill.runtime.v1.TopK.Entry - 46, // 110: rill.runtime.v1.ColumnDescriptiveStatisticsResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary - 47, // 111: rill.runtime.v1.NumericSummary.numeric_histogram_bins:type_name -> rill.runtime.v1.NumericHistogramBins - 48, // 112: rill.runtime.v1.NumericSummary.numeric_statistics:type_name -> rill.runtime.v1.NumericStatistics - 49, // 113: rill.runtime.v1.NumericSummary.numeric_outliers:type_name -> rill.runtime.v1.NumericOutliers - 75, // 114: rill.runtime.v1.NumericHistogramBins.bins:type_name -> rill.runtime.v1.NumericHistogramBins.Bin - 76, // 115: rill.runtime.v1.NumericOutliers.outliers:type_name -> rill.runtime.v1.NumericOutliers.Outlier - 84, // 116: rill.runtime.v1.ColumnTimeGrainResponse.time_grain:type_name -> rill.runtime.v1.TimeGrain - 2, // 117: rill.runtime.v1.ColumnNumericHistogramRequest.histogram_method:type_name -> rill.runtime.v1.HistogramMethod - 46, // 118: rill.runtime.v1.ColumnNumericHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary - 46, // 119: rill.runtime.v1.ColumnRugHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary - 58, // 120: rill.runtime.v1.ColumnTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary - 83, // 121: rill.runtime.v1.TimeRangeSummary.min:type_name -> google.protobuf.Timestamp - 83, // 122: rill.runtime.v1.TimeRangeSummary.max:type_name -> google.protobuf.Timestamp - 77, // 123: rill.runtime.v1.TimeRangeSummary.interval:type_name -> rill.runtime.v1.TimeRangeSummary.Interval - 40, // 124: rill.runtime.v1.ColumnCardinalityResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary - 78, // 125: rill.runtime.v1.ColumnTimeSeriesRequest.measures:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure - 63, // 126: rill.runtime.v1.ColumnTimeSeriesRequest.time_range:type_name -> rill.runtime.v1.TimeSeriesTimeRange - 64, // 127: rill.runtime.v1.ColumnTimeSeriesResponse.rollup:type_name -> rill.runtime.v1.TimeSeriesResponse - 83, // 128: rill.runtime.v1.TimeSeriesTimeRange.start:type_name -> google.protobuf.Timestamp - 83, // 129: rill.runtime.v1.TimeSeriesTimeRange.end:type_name -> google.protobuf.Timestamp - 84, // 130: rill.runtime.v1.TimeSeriesTimeRange.interval:type_name -> rill.runtime.v1.TimeGrain - 65, // 131: rill.runtime.v1.TimeSeriesResponse.results:type_name -> rill.runtime.v1.TimeSeriesValue - 65, // 132: rill.runtime.v1.TimeSeriesResponse.spark:type_name -> rill.runtime.v1.TimeSeriesValue - 83, // 133: rill.runtime.v1.TimeSeriesValue.ts:type_name -> google.protobuf.Timestamp - 81, // 134: rill.runtime.v1.TimeSeriesValue.records:type_name -> google.protobuf.Struct - 70, // 135: rill.runtime.v1.TableColumnsResponse.profile_columns:type_name -> rill.runtime.v1.ProfileColumn - 81, // 136: rill.runtime.v1.TableRowsResponse.data:type_name -> google.protobuf.Struct - 79, // 137: rill.runtime.v1.MetricsViewFilter.Cond.in:type_name -> google.protobuf.Value - 79, // 138: rill.runtime.v1.TopK.Entry.value:type_name -> google.protobuf.Value - 3, // 139: rill.runtime.v1.QueryService.Query:input_type -> rill.runtime.v1.QueryRequest - 5, // 140: rill.runtime.v1.QueryService.QueryBatch:input_type -> rill.runtime.v1.QueryBatchRequest - 7, // 141: rill.runtime.v1.QueryService.Export:input_type -> rill.runtime.v1.ExportRequest - 11, // 142: rill.runtime.v1.QueryService.MetricsViewAggregation:input_type -> rill.runtime.v1.MetricsViewAggregationRequest - 16, // 143: rill.runtime.v1.QueryService.MetricsViewToplist:input_type -> rill.runtime.v1.MetricsViewToplistRequest - 18, // 144: rill.runtime.v1.QueryService.MetricsViewComparison:input_type -> rill.runtime.v1.MetricsViewComparisonRequest - 24, // 145: rill.runtime.v1.QueryService.MetricsViewTimeSeries:input_type -> rill.runtime.v1.MetricsViewTimeSeriesRequest - 26, // 146: rill.runtime.v1.QueryService.MetricsViewTotals:input_type -> rill.runtime.v1.MetricsViewTotalsRequest - 28, // 147: rill.runtime.v1.QueryService.MetricsViewRows:input_type -> rill.runtime.v1.MetricsViewRowsRequest - 34, // 148: rill.runtime.v1.QueryService.MetricsViewTimeRange:input_type -> rill.runtime.v1.MetricsViewTimeRangeRequest - 36, // 149: rill.runtime.v1.QueryService.ColumnRollupInterval:input_type -> rill.runtime.v1.ColumnRollupIntervalRequest - 38, // 150: rill.runtime.v1.QueryService.ColumnTopK:input_type -> rill.runtime.v1.ColumnTopKRequest - 42, // 151: rill.runtime.v1.QueryService.ColumnNullCount:input_type -> rill.runtime.v1.ColumnNullCountRequest - 44, // 152: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:input_type -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest - 50, // 153: rill.runtime.v1.QueryService.ColumnTimeGrain:input_type -> rill.runtime.v1.ColumnTimeGrainRequest - 52, // 154: rill.runtime.v1.QueryService.ColumnNumericHistogram:input_type -> rill.runtime.v1.ColumnNumericHistogramRequest - 54, // 155: rill.runtime.v1.QueryService.ColumnRugHistogram:input_type -> rill.runtime.v1.ColumnRugHistogramRequest - 56, // 156: rill.runtime.v1.QueryService.ColumnTimeRange:input_type -> rill.runtime.v1.ColumnTimeRangeRequest - 59, // 157: rill.runtime.v1.QueryService.ColumnCardinality:input_type -> rill.runtime.v1.ColumnCardinalityRequest - 61, // 158: rill.runtime.v1.QueryService.ColumnTimeSeries:input_type -> rill.runtime.v1.ColumnTimeSeriesRequest - 66, // 159: rill.runtime.v1.QueryService.TableCardinality:input_type -> rill.runtime.v1.TableCardinalityRequest - 68, // 160: rill.runtime.v1.QueryService.TableColumns:input_type -> rill.runtime.v1.TableColumnsRequest - 71, // 161: rill.runtime.v1.QueryService.TableRows:input_type -> rill.runtime.v1.TableRowsRequest - 4, // 162: rill.runtime.v1.QueryService.Query:output_type -> rill.runtime.v1.QueryResponse - 6, // 163: rill.runtime.v1.QueryService.QueryBatch:output_type -> rill.runtime.v1.QueryBatchResponse - 8, // 164: rill.runtime.v1.QueryService.Export:output_type -> rill.runtime.v1.ExportResponse - 12, // 165: rill.runtime.v1.QueryService.MetricsViewAggregation:output_type -> rill.runtime.v1.MetricsViewAggregationResponse - 17, // 166: rill.runtime.v1.QueryService.MetricsViewToplist:output_type -> rill.runtime.v1.MetricsViewToplistResponse - 19, // 167: rill.runtime.v1.QueryService.MetricsViewComparison:output_type -> rill.runtime.v1.MetricsViewComparisonResponse - 25, // 168: rill.runtime.v1.QueryService.MetricsViewTimeSeries:output_type -> rill.runtime.v1.MetricsViewTimeSeriesResponse - 27, // 169: rill.runtime.v1.QueryService.MetricsViewTotals:output_type -> rill.runtime.v1.MetricsViewTotalsResponse - 29, // 170: rill.runtime.v1.QueryService.MetricsViewRows:output_type -> rill.runtime.v1.MetricsViewRowsResponse - 35, // 171: rill.runtime.v1.QueryService.MetricsViewTimeRange:output_type -> rill.runtime.v1.MetricsViewTimeRangeResponse - 37, // 172: rill.runtime.v1.QueryService.ColumnRollupInterval:output_type -> rill.runtime.v1.ColumnRollupIntervalResponse - 39, // 173: rill.runtime.v1.QueryService.ColumnTopK:output_type -> rill.runtime.v1.ColumnTopKResponse - 43, // 174: rill.runtime.v1.QueryService.ColumnNullCount:output_type -> rill.runtime.v1.ColumnNullCountResponse - 45, // 175: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:output_type -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse - 51, // 176: rill.runtime.v1.QueryService.ColumnTimeGrain:output_type -> rill.runtime.v1.ColumnTimeGrainResponse - 53, // 177: rill.runtime.v1.QueryService.ColumnNumericHistogram:output_type -> rill.runtime.v1.ColumnNumericHistogramResponse - 55, // 178: rill.runtime.v1.QueryService.ColumnRugHistogram:output_type -> rill.runtime.v1.ColumnRugHistogramResponse - 57, // 179: rill.runtime.v1.QueryService.ColumnTimeRange:output_type -> rill.runtime.v1.ColumnTimeRangeResponse - 60, // 180: rill.runtime.v1.QueryService.ColumnCardinality:output_type -> rill.runtime.v1.ColumnCardinalityResponse - 62, // 181: rill.runtime.v1.QueryService.ColumnTimeSeries:output_type -> rill.runtime.v1.ColumnTimeSeriesResponse - 67, // 182: rill.runtime.v1.QueryService.TableCardinality:output_type -> rill.runtime.v1.TableCardinalityResponse - 69, // 183: rill.runtime.v1.QueryService.TableColumns:output_type -> rill.runtime.v1.TableColumnsResponse - 72, // 184: rill.runtime.v1.QueryService.TableRows:output_type -> rill.runtime.v1.TableRowsResponse - 162, // [162:185] is the sub-list for method output_type - 139, // [139:162] is the sub-list for method input_type - 139, // [139:139] is the sub-list for extension type_name - 139, // [139:139] is the sub-list for extension extendee - 0, // [0:139] is the sub-list for field type_name + 81, // 0: rill.runtime.v1.QueryRequest.args:type_name -> google.protobuf.Value + 82, // 1: rill.runtime.v1.QueryResponse.meta:type_name -> rill.runtime.v1.StructType + 83, // 2: rill.runtime.v1.QueryResponse.data:type_name -> google.protobuf.Struct + 10, // 3: rill.runtime.v1.QueryBatchRequest.queries:type_name -> rill.runtime.v1.Query + 11, // 4: rill.runtime.v1.QueryBatchResponse.result:type_name -> rill.runtime.v1.QueryResult + 84, // 5: rill.runtime.v1.ExportRequest.format:type_name -> rill.runtime.v1.ExportFormat + 10, // 6: rill.runtime.v1.ExportRequest.query:type_name -> rill.runtime.v1.Query + 12, // 7: rill.runtime.v1.Query.metrics_view_aggregation_request:type_name -> rill.runtime.v1.MetricsViewAggregationRequest + 17, // 8: rill.runtime.v1.Query.metrics_view_toplist_request:type_name -> rill.runtime.v1.MetricsViewToplistRequest + 19, // 9: rill.runtime.v1.Query.metrics_view_comparison_request:type_name -> rill.runtime.v1.MetricsViewComparisonRequest + 26, // 10: rill.runtime.v1.Query.metrics_view_time_series_request:type_name -> rill.runtime.v1.MetricsViewTimeSeriesRequest + 28, // 11: rill.runtime.v1.Query.metrics_view_totals_request:type_name -> rill.runtime.v1.MetricsViewTotalsRequest + 30, // 12: rill.runtime.v1.Query.metrics_view_rows_request:type_name -> rill.runtime.v1.MetricsViewRowsRequest + 38, // 13: rill.runtime.v1.Query.column_rollup_interval_request:type_name -> rill.runtime.v1.ColumnRollupIntervalRequest + 40, // 14: rill.runtime.v1.Query.column_top_k_request:type_name -> rill.runtime.v1.ColumnTopKRequest + 44, // 15: rill.runtime.v1.Query.column_null_count_request:type_name -> rill.runtime.v1.ColumnNullCountRequest + 46, // 16: rill.runtime.v1.Query.column_descriptive_statistics_request:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest + 52, // 17: rill.runtime.v1.Query.column_time_grain_request:type_name -> rill.runtime.v1.ColumnTimeGrainRequest + 54, // 18: rill.runtime.v1.Query.column_numeric_histogram_request:type_name -> rill.runtime.v1.ColumnNumericHistogramRequest + 56, // 19: rill.runtime.v1.Query.column_rug_histogram_request:type_name -> rill.runtime.v1.ColumnRugHistogramRequest + 58, // 20: rill.runtime.v1.Query.column_time_range_request:type_name -> rill.runtime.v1.ColumnTimeRangeRequest + 61, // 21: rill.runtime.v1.Query.column_cardinality_request:type_name -> rill.runtime.v1.ColumnCardinalityRequest + 63, // 22: rill.runtime.v1.Query.column_time_series_request:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest + 68, // 23: rill.runtime.v1.Query.table_cardinality_request:type_name -> rill.runtime.v1.TableCardinalityRequest + 70, // 24: rill.runtime.v1.Query.table_columns_request:type_name -> rill.runtime.v1.TableColumnsRequest + 73, // 25: rill.runtime.v1.Query.table_rows_request:type_name -> rill.runtime.v1.TableRowsRequest + 13, // 26: rill.runtime.v1.QueryResult.metrics_view_aggregation_response:type_name -> rill.runtime.v1.MetricsViewAggregationResponse + 18, // 27: rill.runtime.v1.QueryResult.metrics_view_toplist_response:type_name -> rill.runtime.v1.MetricsViewToplistResponse + 20, // 28: rill.runtime.v1.QueryResult.metrics_view_comparison_response:type_name -> rill.runtime.v1.MetricsViewComparisonResponse + 27, // 29: rill.runtime.v1.QueryResult.metrics_view_time_series_response:type_name -> rill.runtime.v1.MetricsViewTimeSeriesResponse + 29, // 30: rill.runtime.v1.QueryResult.metrics_view_totals_response:type_name -> rill.runtime.v1.MetricsViewTotalsResponse + 31, // 31: rill.runtime.v1.QueryResult.metrics_view_rows_response:type_name -> rill.runtime.v1.MetricsViewRowsResponse + 39, // 32: rill.runtime.v1.QueryResult.column_rollup_interval_response:type_name -> rill.runtime.v1.ColumnRollupIntervalResponse + 41, // 33: rill.runtime.v1.QueryResult.column_top_k_response:type_name -> rill.runtime.v1.ColumnTopKResponse + 45, // 34: rill.runtime.v1.QueryResult.column_null_count_response:type_name -> rill.runtime.v1.ColumnNullCountResponse + 47, // 35: rill.runtime.v1.QueryResult.column_descriptive_statistics_response:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse + 53, // 36: rill.runtime.v1.QueryResult.column_time_grain_response:type_name -> rill.runtime.v1.ColumnTimeGrainResponse + 55, // 37: rill.runtime.v1.QueryResult.column_numeric_histogram_response:type_name -> rill.runtime.v1.ColumnNumericHistogramResponse + 57, // 38: rill.runtime.v1.QueryResult.column_rug_histogram_response:type_name -> rill.runtime.v1.ColumnRugHistogramResponse + 59, // 39: rill.runtime.v1.QueryResult.column_time_range_response:type_name -> rill.runtime.v1.ColumnTimeRangeResponse + 62, // 40: rill.runtime.v1.QueryResult.column_cardinality_response:type_name -> rill.runtime.v1.ColumnCardinalityResponse + 64, // 41: rill.runtime.v1.QueryResult.column_time_series_response:type_name -> rill.runtime.v1.ColumnTimeSeriesResponse + 69, // 42: rill.runtime.v1.QueryResult.table_cardinality_response:type_name -> rill.runtime.v1.TableCardinalityResponse + 71, // 43: rill.runtime.v1.QueryResult.table_columns_response:type_name -> rill.runtime.v1.TableColumnsResponse + 74, // 44: rill.runtime.v1.QueryResult.table_rows_response:type_name -> rill.runtime.v1.TableRowsResponse + 14, // 45: rill.runtime.v1.MetricsViewAggregationRequest.dimensions:type_name -> rill.runtime.v1.MetricsViewAggregationDimension + 15, // 46: rill.runtime.v1.MetricsViewAggregationRequest.measures:type_name -> rill.runtime.v1.MetricsViewAggregationMeasure + 16, // 47: rill.runtime.v1.MetricsViewAggregationRequest.sort:type_name -> rill.runtime.v1.MetricsViewAggregationSort + 21, // 48: rill.runtime.v1.MetricsViewAggregationRequest.time_range:type_name -> rill.runtime.v1.TimeRange + 85, // 49: rill.runtime.v1.MetricsViewAggregationRequest.time_start:type_name -> google.protobuf.Timestamp + 85, // 50: rill.runtime.v1.MetricsViewAggregationRequest.time_end:type_name -> google.protobuf.Timestamp + 86, // 51: rill.runtime.v1.MetricsViewAggregationRequest.where:type_name -> rill.runtime.v1.Expression + 86, // 52: rill.runtime.v1.MetricsViewAggregationRequest.having:type_name -> rill.runtime.v1.Expression + 33, // 53: rill.runtime.v1.MetricsViewAggregationRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 82, // 54: rill.runtime.v1.MetricsViewAggregationResponse.schema:type_name -> rill.runtime.v1.StructType + 83, // 55: rill.runtime.v1.MetricsViewAggregationResponse.data:type_name -> google.protobuf.Struct + 87, // 56: rill.runtime.v1.MetricsViewAggregationDimension.time_grain:type_name -> rill.runtime.v1.TimeGrain + 0, // 57: rill.runtime.v1.MetricsViewAggregationMeasure.builtin_measure:type_name -> rill.runtime.v1.BuiltinMeasure + 81, // 58: rill.runtime.v1.MetricsViewAggregationMeasure.builtin_measure_args:type_name -> google.protobuf.Value + 35, // 59: rill.runtime.v1.MetricsViewToplistRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure + 85, // 60: rill.runtime.v1.MetricsViewToplistRequest.time_start:type_name -> google.protobuf.Timestamp + 85, // 61: rill.runtime.v1.MetricsViewToplistRequest.time_end:type_name -> google.protobuf.Timestamp + 32, // 62: rill.runtime.v1.MetricsViewToplistRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort + 86, // 63: rill.runtime.v1.MetricsViewToplistRequest.where:type_name -> rill.runtime.v1.Expression + 86, // 64: rill.runtime.v1.MetricsViewToplistRequest.having:type_name -> rill.runtime.v1.Expression + 33, // 65: rill.runtime.v1.MetricsViewToplistRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 34, // 66: rill.runtime.v1.MetricsViewToplistResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 83, // 67: rill.runtime.v1.MetricsViewToplistResponse.data:type_name -> google.protobuf.Struct + 14, // 68: rill.runtime.v1.MetricsViewComparisonRequest.dimension:type_name -> rill.runtime.v1.MetricsViewAggregationDimension + 15, // 69: rill.runtime.v1.MetricsViewComparisonRequest.measures:type_name -> rill.runtime.v1.MetricsViewAggregationMeasure + 22, // 70: rill.runtime.v1.MetricsViewComparisonRequest.sort:type_name -> rill.runtime.v1.MetricsViewComparisonSort + 21, // 71: rill.runtime.v1.MetricsViewComparisonRequest.time_range:type_name -> rill.runtime.v1.TimeRange + 21, // 72: rill.runtime.v1.MetricsViewComparisonRequest.comparison_time_range:type_name -> rill.runtime.v1.TimeRange + 86, // 73: rill.runtime.v1.MetricsViewComparisonRequest.where:type_name -> rill.runtime.v1.Expression + 86, // 74: rill.runtime.v1.MetricsViewComparisonRequest.having:type_name -> rill.runtime.v1.Expression + 25, // 75: rill.runtime.v1.MetricsViewComparisonRequest.aliases:type_name -> rill.runtime.v1.MetricsViewComparisonMeasureAlias + 33, // 76: rill.runtime.v1.MetricsViewComparisonRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 23, // 77: rill.runtime.v1.MetricsViewComparisonResponse.rows:type_name -> rill.runtime.v1.MetricsViewComparisonRow + 85, // 78: rill.runtime.v1.TimeRange.start:type_name -> google.protobuf.Timestamp + 85, // 79: rill.runtime.v1.TimeRange.end:type_name -> google.protobuf.Timestamp + 87, // 80: rill.runtime.v1.TimeRange.round_to_grain:type_name -> rill.runtime.v1.TimeGrain + 1, // 81: rill.runtime.v1.MetricsViewComparisonSort.type:type_name -> rill.runtime.v1.MetricsViewComparisonSortType + 2, // 82: rill.runtime.v1.MetricsViewComparisonSort.sort_type:type_name -> rill.runtime.v1.MetricsViewComparisonMeasureType + 81, // 83: rill.runtime.v1.MetricsViewComparisonRow.dimension_value:type_name -> google.protobuf.Value + 24, // 84: rill.runtime.v1.MetricsViewComparisonRow.measure_values:type_name -> rill.runtime.v1.MetricsViewComparisonValue + 81, // 85: rill.runtime.v1.MetricsViewComparisonValue.base_value:type_name -> google.protobuf.Value + 81, // 86: rill.runtime.v1.MetricsViewComparisonValue.comparison_value:type_name -> google.protobuf.Value + 81, // 87: rill.runtime.v1.MetricsViewComparisonValue.delta_abs:type_name -> google.protobuf.Value + 81, // 88: rill.runtime.v1.MetricsViewComparisonValue.delta_rel:type_name -> google.protobuf.Value + 2, // 89: rill.runtime.v1.MetricsViewComparisonMeasureAlias.type:type_name -> rill.runtime.v1.MetricsViewComparisonMeasureType + 35, // 90: rill.runtime.v1.MetricsViewTimeSeriesRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure + 85, // 91: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_start:type_name -> google.protobuf.Timestamp + 85, // 92: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_end:type_name -> google.protobuf.Timestamp + 87, // 93: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain + 86, // 94: rill.runtime.v1.MetricsViewTimeSeriesRequest.where:type_name -> rill.runtime.v1.Expression + 86, // 95: rill.runtime.v1.MetricsViewTimeSeriesRequest.having:type_name -> rill.runtime.v1.Expression + 33, // 96: rill.runtime.v1.MetricsViewTimeSeriesRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 34, // 97: rill.runtime.v1.MetricsViewTimeSeriesResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 67, // 98: rill.runtime.v1.MetricsViewTimeSeriesResponse.data:type_name -> rill.runtime.v1.TimeSeriesValue + 35, // 99: rill.runtime.v1.MetricsViewTotalsRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure + 85, // 100: rill.runtime.v1.MetricsViewTotalsRequest.time_start:type_name -> google.protobuf.Timestamp + 85, // 101: rill.runtime.v1.MetricsViewTotalsRequest.time_end:type_name -> google.protobuf.Timestamp + 86, // 102: rill.runtime.v1.MetricsViewTotalsRequest.where:type_name -> rill.runtime.v1.Expression + 33, // 103: rill.runtime.v1.MetricsViewTotalsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 34, // 104: rill.runtime.v1.MetricsViewTotalsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 83, // 105: rill.runtime.v1.MetricsViewTotalsResponse.data:type_name -> google.protobuf.Struct + 85, // 106: rill.runtime.v1.MetricsViewRowsRequest.time_start:type_name -> google.protobuf.Timestamp + 85, // 107: rill.runtime.v1.MetricsViewRowsRequest.time_end:type_name -> google.protobuf.Timestamp + 87, // 108: rill.runtime.v1.MetricsViewRowsRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain + 86, // 109: rill.runtime.v1.MetricsViewRowsRequest.where:type_name -> rill.runtime.v1.Expression + 32, // 110: rill.runtime.v1.MetricsViewRowsRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort + 33, // 111: rill.runtime.v1.MetricsViewRowsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 34, // 112: rill.runtime.v1.MetricsViewRowsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 83, // 113: rill.runtime.v1.MetricsViewRowsResponse.data:type_name -> google.protobuf.Struct + 75, // 114: rill.runtime.v1.MetricsViewFilter.include:type_name -> rill.runtime.v1.MetricsViewFilter.Cond + 75, // 115: rill.runtime.v1.MetricsViewFilter.exclude:type_name -> rill.runtime.v1.MetricsViewFilter.Cond + 60, // 116: rill.runtime.v1.MetricsViewTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary + 85, // 117: rill.runtime.v1.ColumnRollupIntervalResponse.start:type_name -> google.protobuf.Timestamp + 85, // 118: rill.runtime.v1.ColumnRollupIntervalResponse.end:type_name -> google.protobuf.Timestamp + 87, // 119: rill.runtime.v1.ColumnRollupIntervalResponse.interval:type_name -> rill.runtime.v1.TimeGrain + 42, // 120: rill.runtime.v1.ColumnTopKResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary + 43, // 121: rill.runtime.v1.CategoricalSummary.top_k:type_name -> rill.runtime.v1.TopK + 76, // 122: rill.runtime.v1.TopK.entries:type_name -> rill.runtime.v1.TopK.Entry + 48, // 123: rill.runtime.v1.ColumnDescriptiveStatisticsResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary + 49, // 124: rill.runtime.v1.NumericSummary.numeric_histogram_bins:type_name -> rill.runtime.v1.NumericHistogramBins + 50, // 125: rill.runtime.v1.NumericSummary.numeric_statistics:type_name -> rill.runtime.v1.NumericStatistics + 51, // 126: rill.runtime.v1.NumericSummary.numeric_outliers:type_name -> rill.runtime.v1.NumericOutliers + 77, // 127: rill.runtime.v1.NumericHistogramBins.bins:type_name -> rill.runtime.v1.NumericHistogramBins.Bin + 78, // 128: rill.runtime.v1.NumericOutliers.outliers:type_name -> rill.runtime.v1.NumericOutliers.Outlier + 87, // 129: rill.runtime.v1.ColumnTimeGrainResponse.time_grain:type_name -> rill.runtime.v1.TimeGrain + 3, // 130: rill.runtime.v1.ColumnNumericHistogramRequest.histogram_method:type_name -> rill.runtime.v1.HistogramMethod + 48, // 131: rill.runtime.v1.ColumnNumericHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary + 48, // 132: rill.runtime.v1.ColumnRugHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary + 60, // 133: rill.runtime.v1.ColumnTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary + 85, // 134: rill.runtime.v1.TimeRangeSummary.min:type_name -> google.protobuf.Timestamp + 85, // 135: rill.runtime.v1.TimeRangeSummary.max:type_name -> google.protobuf.Timestamp + 79, // 136: rill.runtime.v1.TimeRangeSummary.interval:type_name -> rill.runtime.v1.TimeRangeSummary.Interval + 42, // 137: rill.runtime.v1.ColumnCardinalityResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary + 80, // 138: rill.runtime.v1.ColumnTimeSeriesRequest.measures:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure + 65, // 139: rill.runtime.v1.ColumnTimeSeriesRequest.time_range:type_name -> rill.runtime.v1.TimeSeriesTimeRange + 66, // 140: rill.runtime.v1.ColumnTimeSeriesResponse.rollup:type_name -> rill.runtime.v1.TimeSeriesResponse + 85, // 141: rill.runtime.v1.TimeSeriesTimeRange.start:type_name -> google.protobuf.Timestamp + 85, // 142: rill.runtime.v1.TimeSeriesTimeRange.end:type_name -> google.protobuf.Timestamp + 87, // 143: rill.runtime.v1.TimeSeriesTimeRange.interval:type_name -> rill.runtime.v1.TimeGrain + 67, // 144: rill.runtime.v1.TimeSeriesResponse.results:type_name -> rill.runtime.v1.TimeSeriesValue + 67, // 145: rill.runtime.v1.TimeSeriesResponse.spark:type_name -> rill.runtime.v1.TimeSeriesValue + 85, // 146: rill.runtime.v1.TimeSeriesValue.ts:type_name -> google.protobuf.Timestamp + 83, // 147: rill.runtime.v1.TimeSeriesValue.records:type_name -> google.protobuf.Struct + 72, // 148: rill.runtime.v1.TableColumnsResponse.profile_columns:type_name -> rill.runtime.v1.ProfileColumn + 83, // 149: rill.runtime.v1.TableRowsResponse.data:type_name -> google.protobuf.Struct + 81, // 150: rill.runtime.v1.MetricsViewFilter.Cond.in:type_name -> google.protobuf.Value + 81, // 151: rill.runtime.v1.TopK.Entry.value:type_name -> google.protobuf.Value + 4, // 152: rill.runtime.v1.QueryService.Query:input_type -> rill.runtime.v1.QueryRequest + 6, // 153: rill.runtime.v1.QueryService.QueryBatch:input_type -> rill.runtime.v1.QueryBatchRequest + 8, // 154: rill.runtime.v1.QueryService.Export:input_type -> rill.runtime.v1.ExportRequest + 12, // 155: rill.runtime.v1.QueryService.MetricsViewAggregation:input_type -> rill.runtime.v1.MetricsViewAggregationRequest + 17, // 156: rill.runtime.v1.QueryService.MetricsViewToplist:input_type -> rill.runtime.v1.MetricsViewToplistRequest + 19, // 157: rill.runtime.v1.QueryService.MetricsViewComparison:input_type -> rill.runtime.v1.MetricsViewComparisonRequest + 26, // 158: rill.runtime.v1.QueryService.MetricsViewTimeSeries:input_type -> rill.runtime.v1.MetricsViewTimeSeriesRequest + 28, // 159: rill.runtime.v1.QueryService.MetricsViewTotals:input_type -> rill.runtime.v1.MetricsViewTotalsRequest + 30, // 160: rill.runtime.v1.QueryService.MetricsViewRows:input_type -> rill.runtime.v1.MetricsViewRowsRequest + 36, // 161: rill.runtime.v1.QueryService.MetricsViewTimeRange:input_type -> rill.runtime.v1.MetricsViewTimeRangeRequest + 38, // 162: rill.runtime.v1.QueryService.ColumnRollupInterval:input_type -> rill.runtime.v1.ColumnRollupIntervalRequest + 40, // 163: rill.runtime.v1.QueryService.ColumnTopK:input_type -> rill.runtime.v1.ColumnTopKRequest + 44, // 164: rill.runtime.v1.QueryService.ColumnNullCount:input_type -> rill.runtime.v1.ColumnNullCountRequest + 46, // 165: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:input_type -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest + 52, // 166: rill.runtime.v1.QueryService.ColumnTimeGrain:input_type -> rill.runtime.v1.ColumnTimeGrainRequest + 54, // 167: rill.runtime.v1.QueryService.ColumnNumericHistogram:input_type -> rill.runtime.v1.ColumnNumericHistogramRequest + 56, // 168: rill.runtime.v1.QueryService.ColumnRugHistogram:input_type -> rill.runtime.v1.ColumnRugHistogramRequest + 58, // 169: rill.runtime.v1.QueryService.ColumnTimeRange:input_type -> rill.runtime.v1.ColumnTimeRangeRequest + 61, // 170: rill.runtime.v1.QueryService.ColumnCardinality:input_type -> rill.runtime.v1.ColumnCardinalityRequest + 63, // 171: rill.runtime.v1.QueryService.ColumnTimeSeries:input_type -> rill.runtime.v1.ColumnTimeSeriesRequest + 68, // 172: rill.runtime.v1.QueryService.TableCardinality:input_type -> rill.runtime.v1.TableCardinalityRequest + 70, // 173: rill.runtime.v1.QueryService.TableColumns:input_type -> rill.runtime.v1.TableColumnsRequest + 73, // 174: rill.runtime.v1.QueryService.TableRows:input_type -> rill.runtime.v1.TableRowsRequest + 5, // 175: rill.runtime.v1.QueryService.Query:output_type -> rill.runtime.v1.QueryResponse + 7, // 176: rill.runtime.v1.QueryService.QueryBatch:output_type -> rill.runtime.v1.QueryBatchResponse + 9, // 177: rill.runtime.v1.QueryService.Export:output_type -> rill.runtime.v1.ExportResponse + 13, // 178: rill.runtime.v1.QueryService.MetricsViewAggregation:output_type -> rill.runtime.v1.MetricsViewAggregationResponse + 18, // 179: rill.runtime.v1.QueryService.MetricsViewToplist:output_type -> rill.runtime.v1.MetricsViewToplistResponse + 20, // 180: rill.runtime.v1.QueryService.MetricsViewComparison:output_type -> rill.runtime.v1.MetricsViewComparisonResponse + 27, // 181: rill.runtime.v1.QueryService.MetricsViewTimeSeries:output_type -> rill.runtime.v1.MetricsViewTimeSeriesResponse + 29, // 182: rill.runtime.v1.QueryService.MetricsViewTotals:output_type -> rill.runtime.v1.MetricsViewTotalsResponse + 31, // 183: rill.runtime.v1.QueryService.MetricsViewRows:output_type -> rill.runtime.v1.MetricsViewRowsResponse + 37, // 184: rill.runtime.v1.QueryService.MetricsViewTimeRange:output_type -> rill.runtime.v1.MetricsViewTimeRangeResponse + 39, // 185: rill.runtime.v1.QueryService.ColumnRollupInterval:output_type -> rill.runtime.v1.ColumnRollupIntervalResponse + 41, // 186: rill.runtime.v1.QueryService.ColumnTopK:output_type -> rill.runtime.v1.ColumnTopKResponse + 45, // 187: rill.runtime.v1.QueryService.ColumnNullCount:output_type -> rill.runtime.v1.ColumnNullCountResponse + 47, // 188: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:output_type -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse + 53, // 189: rill.runtime.v1.QueryService.ColumnTimeGrain:output_type -> rill.runtime.v1.ColumnTimeGrainResponse + 55, // 190: rill.runtime.v1.QueryService.ColumnNumericHistogram:output_type -> rill.runtime.v1.ColumnNumericHistogramResponse + 57, // 191: rill.runtime.v1.QueryService.ColumnRugHistogram:output_type -> rill.runtime.v1.ColumnRugHistogramResponse + 59, // 192: rill.runtime.v1.QueryService.ColumnTimeRange:output_type -> rill.runtime.v1.ColumnTimeRangeResponse + 62, // 193: rill.runtime.v1.QueryService.ColumnCardinality:output_type -> rill.runtime.v1.ColumnCardinalityResponse + 64, // 194: rill.runtime.v1.QueryService.ColumnTimeSeries:output_type -> rill.runtime.v1.ColumnTimeSeriesResponse + 69, // 195: rill.runtime.v1.QueryService.TableCardinality:output_type -> rill.runtime.v1.TableCardinalityResponse + 71, // 196: rill.runtime.v1.QueryService.TableColumns:output_type -> rill.runtime.v1.TableColumnsResponse + 74, // 197: rill.runtime.v1.QueryService.TableRows:output_type -> rill.runtime.v1.TableRowsResponse + 175, // [175:198] is the sub-list for method output_type + 152, // [152:175] is the sub-list for method input_type + 152, // [152:152] is the sub-list for extension type_name + 152, // [152:152] is the sub-list for extension extendee + 0, // [0:152] is the sub-list for field type_name } func init() { file_rill_runtime_v1_queries_proto_init() } @@ -7522,6 +7826,7 @@ func file_rill_runtime_v1_queries_proto_init() { file_rill_runtime_v1_export_format_proto_init() file_rill_runtime_v1_schema_proto_init() file_rill_runtime_v1_time_grain_proto_init() + file_rill_runtime_v1_expression_proto_init() if !protoimpl.UnsafeEnabled { file_rill_runtime_v1_queries_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryRequest); i { @@ -7776,7 +8081,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeSeriesRequest); i { + switch v := v.(*MetricsViewComparisonMeasureAlias); i { case 0: return &v.state case 1: @@ -7788,7 +8093,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeSeriesResponse); i { + switch v := v.(*MetricsViewTimeSeriesRequest); i { case 0: return &v.state case 1: @@ -7800,7 +8105,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTotalsRequest); i { + switch v := v.(*MetricsViewTimeSeriesResponse); i { case 0: return &v.state case 1: @@ -7812,7 +8117,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTotalsResponse); i { + switch v := v.(*MetricsViewTotalsRequest); i { case 0: return &v.state case 1: @@ -7824,7 +8129,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewRowsRequest); i { + switch v := v.(*MetricsViewTotalsResponse); i { case 0: return &v.state case 1: @@ -7836,7 +8141,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewRowsResponse); i { + switch v := v.(*MetricsViewRowsRequest); i { case 0: return &v.state case 1: @@ -7848,7 +8153,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewSort); i { + switch v := v.(*MetricsViewRowsResponse); i { case 0: return &v.state case 1: @@ -7860,7 +8165,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewFilter); i { + switch v := v.(*MetricsViewSort); i { case 0: return &v.state case 1: @@ -7872,7 +8177,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewColumn); i { + switch v := v.(*MetricsViewFilter); i { case 0: return &v.state case 1: @@ -7884,7 +8189,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InlineMeasure); i { + switch v := v.(*MetricsViewColumn); i { case 0: return &v.state case 1: @@ -7896,7 +8201,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeRangeRequest); i { + switch v := v.(*InlineMeasure); i { case 0: return &v.state case 1: @@ -7908,7 +8213,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeRangeResponse); i { + switch v := v.(*MetricsViewTimeRangeRequest); i { case 0: return &v.state case 1: @@ -7920,7 +8225,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRollupIntervalRequest); i { + switch v := v.(*MetricsViewTimeRangeResponse); i { case 0: return &v.state case 1: @@ -7932,7 +8237,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRollupIntervalResponse); i { + switch v := v.(*ColumnRollupIntervalRequest); i { case 0: return &v.state case 1: @@ -7944,7 +8249,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTopKRequest); i { + switch v := v.(*ColumnRollupIntervalResponse); i { case 0: return &v.state case 1: @@ -7956,7 +8261,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTopKResponse); i { + switch v := v.(*ColumnTopKRequest); i { case 0: return &v.state case 1: @@ -7968,7 +8273,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CategoricalSummary); i { + switch v := v.(*ColumnTopKResponse); i { case 0: return &v.state case 1: @@ -7980,7 +8285,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopK); i { + switch v := v.(*CategoricalSummary); i { case 0: return &v.state case 1: @@ -7992,7 +8297,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNullCountRequest); i { + switch v := v.(*TopK); i { case 0: return &v.state case 1: @@ -8004,7 +8309,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNullCountResponse); i { + switch v := v.(*ColumnNullCountRequest); i { case 0: return &v.state case 1: @@ -8016,7 +8321,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnDescriptiveStatisticsRequest); i { + switch v := v.(*ColumnNullCountResponse); i { case 0: return &v.state case 1: @@ -8028,7 +8333,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnDescriptiveStatisticsResponse); i { + switch v := v.(*ColumnDescriptiveStatisticsRequest); i { case 0: return &v.state case 1: @@ -8040,7 +8345,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericSummary); i { + switch v := v.(*ColumnDescriptiveStatisticsResponse); i { case 0: return &v.state case 1: @@ -8052,7 +8357,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericHistogramBins); i { + switch v := v.(*NumericSummary); i { case 0: return &v.state case 1: @@ -8064,7 +8369,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericStatistics); i { + switch v := v.(*NumericHistogramBins); i { case 0: return &v.state case 1: @@ -8076,7 +8381,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericOutliers); i { + switch v := v.(*NumericStatistics); i { case 0: return &v.state case 1: @@ -8088,7 +8393,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeGrainRequest); i { + switch v := v.(*NumericOutliers); i { case 0: return &v.state case 1: @@ -8100,7 +8405,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeGrainResponse); i { + switch v := v.(*ColumnTimeGrainRequest); i { case 0: return &v.state case 1: @@ -8112,7 +8417,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNumericHistogramRequest); i { + switch v := v.(*ColumnTimeGrainResponse); i { case 0: return &v.state case 1: @@ -8124,7 +8429,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNumericHistogramResponse); i { + switch v := v.(*ColumnNumericHistogramRequest); i { case 0: return &v.state case 1: @@ -8136,7 +8441,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRugHistogramRequest); i { + switch v := v.(*ColumnNumericHistogramResponse); i { case 0: return &v.state case 1: @@ -8148,7 +8453,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRugHistogramResponse); i { + switch v := v.(*ColumnRugHistogramRequest); i { case 0: return &v.state case 1: @@ -8160,7 +8465,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeRangeRequest); i { + switch v := v.(*ColumnRugHistogramResponse); i { case 0: return &v.state case 1: @@ -8172,7 +8477,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeRangeResponse); i { + switch v := v.(*ColumnTimeRangeRequest); i { case 0: return &v.state case 1: @@ -8184,7 +8489,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeRangeSummary); i { + switch v := v.(*ColumnTimeRangeResponse); i { case 0: return &v.state case 1: @@ -8196,7 +8501,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnCardinalityRequest); i { + switch v := v.(*TimeRangeSummary); i { case 0: return &v.state case 1: @@ -8208,7 +8513,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnCardinalityResponse); i { + switch v := v.(*ColumnCardinalityRequest); i { case 0: return &v.state case 1: @@ -8220,7 +8525,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeSeriesRequest); i { + switch v := v.(*ColumnCardinalityResponse); i { case 0: return &v.state case 1: @@ -8232,7 +8537,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeSeriesResponse); i { + switch v := v.(*ColumnTimeSeriesRequest); i { case 0: return &v.state case 1: @@ -8244,7 +8549,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeSeriesTimeRange); i { + switch v := v.(*ColumnTimeSeriesResponse); i { case 0: return &v.state case 1: @@ -8256,7 +8561,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeSeriesResponse); i { + switch v := v.(*TimeSeriesTimeRange); i { case 0: return &v.state case 1: @@ -8268,7 +8573,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeSeriesValue); i { + switch v := v.(*TimeSeriesResponse); i { case 0: return &v.state case 1: @@ -8280,7 +8585,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableCardinalityRequest); i { + switch v := v.(*TimeSeriesValue); i { case 0: return &v.state case 1: @@ -8292,7 +8597,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableCardinalityResponse); i { + switch v := v.(*TableCardinalityRequest); i { case 0: return &v.state case 1: @@ -8304,7 +8609,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableColumnsRequest); i { + switch v := v.(*TableCardinalityResponse); i { case 0: return &v.state case 1: @@ -8316,7 +8621,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableColumnsResponse); i { + switch v := v.(*TableColumnsRequest); i { case 0: return &v.state case 1: @@ -8328,7 +8633,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfileColumn); i { + switch v := v.(*TableColumnsResponse); i { case 0: return &v.state case 1: @@ -8340,7 +8645,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableRowsRequest); i { + switch v := v.(*ProfileColumn); i { case 0: return &v.state case 1: @@ -8352,7 +8657,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableRowsResponse); i { + switch v := v.(*TableRowsRequest); i { case 0: return &v.state case 1: @@ -8364,7 +8669,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewFilter_Cond); i { + switch v := v.(*TableRowsResponse); i { case 0: return &v.state case 1: @@ -8376,7 +8681,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopK_Entry); i { + switch v := v.(*MetricsViewFilter_Cond); i { case 0: return &v.state case 1: @@ -8388,7 +8693,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericHistogramBins_Bin); i { + switch v := v.(*TopK_Entry); i { case 0: return &v.state case 1: @@ -8400,7 +8705,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericOutliers_Outlier); i { + switch v := v.(*NumericHistogramBins_Bin); i { case 0: return &v.state case 1: @@ -8412,7 +8717,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeRangeSummary_Interval); i { + switch v := v.(*NumericOutliers_Outlier); i { case 0: return &v.state case 1: @@ -8424,6 +8729,18 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TimeRangeSummary_Interval); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_queries_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ColumnTimeSeriesRequest_BasicMeasure); i { case 0: return &v.state @@ -8478,11 +8795,11 @@ func file_rill_runtime_v1_queries_proto_init() { (*QueryResult_TableColumnsResponse)(nil), (*QueryResult_TableRowsResponse)(nil), } - file_rill_runtime_v1_queries_proto_msgTypes[37].OneofWrappers = []interface{}{ + file_rill_runtime_v1_queries_proto_msgTypes[38].OneofWrappers = []interface{}{ (*CategoricalSummary_TopK)(nil), (*CategoricalSummary_Cardinality)(nil), } - file_rill_runtime_v1_queries_proto_msgTypes[43].OneofWrappers = []interface{}{ + file_rill_runtime_v1_queries_proto_msgTypes[44].OneofWrappers = []interface{}{ (*NumericSummary_NumericHistogramBins)(nil), (*NumericSummary_NumericStatistics)(nil), (*NumericSummary_NumericOutliers)(nil), @@ -8492,8 +8809,8 @@ func file_rill_runtime_v1_queries_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rill_runtime_v1_queries_proto_rawDesc, - NumEnums: 3, - NumMessages: 76, + NumEnums: 4, + NumMessages: 77, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gen/rill/runtime/v1/queries.pb.validate.go b/proto/gen/rill/runtime/v1/queries.pb.validate.go index 774025e83e7..d447ff9cb8f 100644 --- a/proto/gen/rill/runtime/v1/queries.pb.validate.go +++ b/proto/gen/rill/runtime/v1/queries.pb.validate.go @@ -2863,11 +2863,11 @@ func (m *MetricsViewAggregationRequest) validate(all bool) error { } if all { - switch v := interface{}(m.GetFilter()).(type) { + switch v := interface{}(m.GetWhere()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, MetricsViewAggregationRequestValidationError{ - field: "Filter", + field: "Where", reason: "embedded message failed validation", cause: err, }) @@ -2875,16 +2875,45 @@ func (m *MetricsViewAggregationRequest) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, MetricsViewAggregationRequestValidationError{ - field: "Filter", + field: "Where", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetFilter()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetWhere()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return MetricsViewAggregationRequestValidationError{ - field: "Filter", + field: "Where", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetHaving()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHaving()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewAggregationRequestValidationError{ + field: "Having", reason: "embedded message failed validation", cause: err, } @@ -2915,6 +2944,35 @@ func (m *MetricsViewAggregationRequest) validate(all bool) error { // no validation rules for Priority + if all { + switch v := interface{}(m.GetFilter()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetFilter()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewAggregationRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MetricsViewAggregationRequestMultiError(errors) } @@ -3712,6 +3770,66 @@ func (m *MetricsViewToplistRequest) validate(all bool) error { } + if all { + switch v := interface{}(m.GetWhere()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewToplistRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewToplistRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetWhere()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewToplistRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetHaving()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewToplistRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewToplistRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHaving()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewToplistRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for Priority + if all { switch v := interface{}(m.GetFilter()).(type) { case interface{ ValidateAll() error }: @@ -3741,8 +3859,6 @@ func (m *MetricsViewToplistRequest) validate(all bool) error { } } - // no validation rules for Priority - if len(errors) > 0 { return MetricsViewToplistRequestMultiError(errors) } @@ -4184,11 +4300,11 @@ func (m *MetricsViewComparisonRequest) validate(all bool) error { } if all { - switch v := interface{}(m.GetFilter()).(type) { + switch v := interface{}(m.GetWhere()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, MetricsViewComparisonRequestValidationError{ - field: "Filter", + field: "Where", reason: "embedded message failed validation", cause: err, }) @@ -4196,22 +4312,85 @@ func (m *MetricsViewComparisonRequest) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, MetricsViewComparisonRequestValidationError{ - field: "Filter", + field: "Where", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetFilter()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetWhere()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return MetricsViewComparisonRequestValidationError{ - field: "Filter", + field: "Where", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetHaving()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewComparisonRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewComparisonRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHaving()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewComparisonRequestValidationError{ + field: "Having", reason: "embedded message failed validation", cause: err, } } } + for idx, item := range m.GetAliases() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewComparisonRequestValidationError{ + field: fmt.Sprintf("Aliases[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewComparisonRequestValidationError{ + field: fmt.Sprintf("Aliases[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewComparisonRequestValidationError{ + field: fmt.Sprintf("Aliases[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + if m.GetLimit() < 0 { err := MetricsViewComparisonRequestValidationError{ field: "Limit", @@ -4238,6 +4417,35 @@ func (m *MetricsViewComparisonRequest) validate(all bool) error { // no validation rules for Exact + if all { + switch v := interface{}(m.GetFilter()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewComparisonRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewComparisonRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetFilter()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewComparisonRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MetricsViewComparisonRequestMultiError(errors) } @@ -4658,6 +4866,8 @@ func (m *MetricsViewComparisonSort) validate(all bool) error { // no validation rules for Type + // no validation rules for SortType + if len(errors) > 0 { return MetricsViewComparisonSortMultiError(errors) } @@ -5123,6 +5333,117 @@ var _ interface { ErrorName() string } = MetricsViewComparisonValueValidationError{} +// Validate checks the field values on MetricsViewComparisonMeasureAlias with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *MetricsViewComparisonMeasureAlias) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MetricsViewComparisonMeasureAlias +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// MetricsViewComparisonMeasureAliasMultiError, or nil if none found. +func (m *MetricsViewComparisonMeasureAlias) ValidateAll() error { + return m.validate(true) +} + +func (m *MetricsViewComparisonMeasureAlias) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Name + + // no validation rules for Type + + // no validation rules for Alias + + if len(errors) > 0 { + return MetricsViewComparisonMeasureAliasMultiError(errors) + } + + return nil +} + +// MetricsViewComparisonMeasureAliasMultiError is an error wrapping multiple +// validation errors returned by +// MetricsViewComparisonMeasureAlias.ValidateAll() if the designated +// constraints aren't met. +type MetricsViewComparisonMeasureAliasMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MetricsViewComparisonMeasureAliasMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m MetricsViewComparisonMeasureAliasMultiError) AllErrors() []error { return m } + +// MetricsViewComparisonMeasureAliasValidationError is the validation error +// returned by MetricsViewComparisonMeasureAlias.Validate if the designated +// constraints aren't met. +type MetricsViewComparisonMeasureAliasValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MetricsViewComparisonMeasureAliasValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MetricsViewComparisonMeasureAliasValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MetricsViewComparisonMeasureAliasValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MetricsViewComparisonMeasureAliasValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MetricsViewComparisonMeasureAliasValidationError) ErrorName() string { + return "MetricsViewComparisonMeasureAliasValidationError" +} + +// Error satisfies the builtin error interface +func (e MetricsViewComparisonMeasureAliasValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMetricsViewComparisonMeasureAlias.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MetricsViewComparisonMeasureAliasValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MetricsViewComparisonMeasureAliasValidationError{} + // Validate checks the field values on MetricsViewTimeSeriesRequest with the // rules defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. @@ -5263,6 +5584,68 @@ func (m *MetricsViewTimeSeriesRequest) validate(all bool) error { // no validation rules for TimeGranularity + if all { + switch v := interface{}(m.GetWhere()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewTimeSeriesRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewTimeSeriesRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetWhere()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewTimeSeriesRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetHaving()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewTimeSeriesRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewTimeSeriesRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHaving()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewTimeSeriesRequestValidationError{ + field: "Having", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for TimeZone + + // no validation rules for Priority + if all { switch v := interface{}(m.GetFilter()).(type) { case interface{ ValidateAll() error }: @@ -5292,10 +5675,6 @@ func (m *MetricsViewTimeSeriesRequest) validate(all bool) error { } } - // no validation rules for TimeZone - - // no validation rules for Priority - if len(errors) > 0 { return MetricsViewTimeSeriesRequestMultiError(errors) } @@ -5686,6 +6065,37 @@ func (m *MetricsViewTotalsRequest) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetWhere()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewTotalsRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewTotalsRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetWhere()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewTotalsRequestValidationError{ + field: "Where", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for Priority + if all { switch v := interface{}(m.GetFilter()).(type) { case interface{ ValidateAll() error }: @@ -5715,8 +6125,6 @@ func (m *MetricsViewTotalsRequest) validate(all bool) error { } } - // no validation rules for Priority - if len(errors) > 0 { return MetricsViewTotalsRequestMultiError(errors) } @@ -6058,11 +6466,11 @@ func (m *MetricsViewRowsRequest) validate(all bool) error { // no validation rules for TimeGranularity if all { - switch v := interface{}(m.GetFilter()).(type) { + switch v := interface{}(m.GetWhere()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, MetricsViewRowsRequestValidationError{ - field: "Filter", + field: "Where", reason: "embedded message failed validation", cause: err, }) @@ -6070,16 +6478,16 @@ func (m *MetricsViewRowsRequest) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, MetricsViewRowsRequestValidationError{ - field: "Filter", + field: "Where", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetFilter()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetWhere()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return MetricsViewRowsRequestValidationError{ - field: "Filter", + field: "Where", reason: "embedded message failed validation", cause: err, } @@ -6146,6 +6554,35 @@ func (m *MetricsViewRowsRequest) validate(all bool) error { // no validation rules for TimeZone + if all { + switch v := interface{}(m.GetFilter()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewRowsRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewRowsRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetFilter()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewRowsRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MetricsViewRowsRequestMultiError(errors) } diff --git a/proto/gen/rill/runtime/v1/runtime.swagger.yaml b/proto/gen/rill/runtime/v1/runtime.swagger.yaml index 775924e6f93..ef2ddac2e60 100644 --- a/proto/gen/rill/runtime/v1/runtime.swagger.yaml +++ b/proto/gen/rill/runtime/v1/runtime.swagger.yaml @@ -1051,8 +1051,10 @@ paths: type: string format: date-time title: Deprecated in favor of time_range - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' limit: type: string format: int64 @@ -1062,6 +1064,9 @@ paths: priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters tags: - QueryService /v1/instances/{instanceId}/queries/metrics-views/{metricsViewName}/compare-toplist: @@ -1107,8 +1112,15 @@ paths: $ref: '#/definitions/v1TimeRange' comparisonTimeRange: $ref: '#/definitions/v1TimeRange' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' + aliases: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewComparisonMeasureAlias' limit: type: string format: int64 @@ -1120,6 +1132,9 @@ paths: format: int32 exact: type: boolean + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters title: Request message for QueryService.MetricsViewComparison tags: - QueryService @@ -1159,8 +1174,8 @@ paths: format: date-time timeGranularity: $ref: '#/definitions/v1TimeGrain' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' sort: type: array items: @@ -1177,6 +1192,9 @@ paths: format: int32 timeZone: type: string + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters tags: - QueryService /v1/instances/{instanceId}/queries/metrics-views/{metricsViewName}/time-range-summary: @@ -1259,13 +1277,18 @@ paths: format: date-time timeGranularity: $ref: '#/definitions/v1TimeGrain' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' timeZone: type: string priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters tags: - QueryService /v1/instances/{instanceId}/queries/metrics-views/{metricsViewName}/toplist: @@ -1326,11 +1349,16 @@ paths: items: type: object $ref: '#/definitions/v1MetricsViewSort' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters tags: - QueryService /v1/instances/{instanceId}/queries/metrics-views/{metricsViewName}/totals: @@ -1378,11 +1406,14 @@ paths: timeEnd: type: string format: date-time - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters tags: - QueryService /v1/instances/{instanceId}/queries/null-count/tables/{tableName}: @@ -2900,6 +2931,16 @@ definitions: properties: categoricalSummary: $ref: '#/definitions/v1CategoricalSummary' + v1Condition: + type: object + properties: + op: + $ref: '#/definitions/v1Operation' + exprs: + type: array + items: + type: object + $ref: '#/definitions/v1Expression' v1Connector: type: object properties: @@ -3053,6 +3094,14 @@ definitions: properties: downloadUrlPath: type: string + v1Expression: + type: object + properties: + ident: + type: string + val: {} + cond: + $ref: '#/definitions/v1Condition' v1FileEvent: type: string enum: @@ -3396,8 +3445,10 @@ definitions: type: string format: date-time title: Deprecated in favor of time_range - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' limit: type: string format: int64 @@ -3407,6 +3458,9 @@ definitions: priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters v1MetricsViewAggregationResponse: type: object properties: @@ -3432,6 +3486,24 @@ definitions: type: string nullable: type: boolean + v1MetricsViewComparisonMeasureAlias: + type: object + properties: + name: + type: string + type: + $ref: '#/definitions/v1MetricsViewComparisonMeasureType' + alias: + type: string + v1MetricsViewComparisonMeasureType: + type: string + enum: + - METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED + - METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE + - METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE + - METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA + - METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA + default: METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED v1MetricsViewComparisonRequest: type: object properties: @@ -3455,8 +3527,15 @@ definitions: $ref: '#/definitions/v1TimeRange' comparisonTimeRange: $ref: '#/definitions/v1TimeRange' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' + aliases: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewComparisonMeasureAlias' limit: type: string format: int64 @@ -3468,6 +3547,9 @@ definitions: format: int32 exact: type: boolean + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters title: Request message for QueryService.MetricsViewComparison v1MetricsViewComparisonResponse: type: object @@ -3496,6 +3578,9 @@ definitions: type: boolean type: $ref: '#/definitions/v1MetricsViewComparisonSortType' + title: Deprecated. Present for backwards compatibility for older reports + sortType: + $ref: '#/definitions/v1MetricsViewComparisonMeasureType' v1MetricsViewComparisonSortType: type: string enum: @@ -3505,6 +3590,7 @@ definitions: - METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA - METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA default: METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED + title: Present for backwards compatibility v1MetricsViewComparisonValue: type: object properties: @@ -3542,8 +3628,8 @@ definitions: format: date-time timeGranularity: $ref: '#/definitions/v1TimeGrain' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' sort: type: array items: @@ -3560,6 +3646,9 @@ definitions: format: int32 timeZone: type: string + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters v1MetricsViewRowsResponse: type: object properties: @@ -3680,13 +3769,18 @@ definitions: format: date-time timeGranularity: $ref: '#/definitions/v1TimeGrain' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' timeZone: type: string priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters v1MetricsViewTimeSeriesResponse: type: object properties: @@ -3735,11 +3829,16 @@ definitions: items: type: object $ref: '#/definitions/v1MetricsViewSort' - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' + having: + $ref: '#/definitions/v1Expression' priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters v1MetricsViewToplistResponse: type: object properties: @@ -3774,11 +3873,14 @@ definitions: timeEnd: type: string format: date-time - filter: - $ref: '#/definitions/v1MetricsViewFilter' + where: + $ref: '#/definitions/v1Expression' priority: type: integer format: int32 + filter: + $ref: '#/definitions/v1MetricsViewFilter' + title: Deprecated. should be removed once UI is moved to use new filters v1MetricsViewTotalsResponse: type: object properties: @@ -3955,6 +4057,23 @@ definitions: - OBJECT_TYPE_METRICS_VIEW default: OBJECT_TYPE_UNSPECIFIED title: ObjectType represents the different kinds of catalog objects + v1Operation: + type: string + enum: + - OPERATION_UNSPECIFIED + - OPERATION_EQ + - OPERATION_NEQ + - OPERATION_LT + - OPERATION_LTE + - OPERATION_GT + - OPERATION_GTE + - OPERATION_OR + - OPERATION_AND + - OPERATION_IN + - OPERATION_NIN + - OPERATION_LIKE + - OPERATION_NLIKE + default: OPERATION_UNSPECIFIED v1ParseError: type: object properties: diff --git a/proto/rill/runtime/v1/expression.proto b/proto/rill/runtime/v1/expression.proto new file mode 100644 index 00000000000..bbb7ecced32 --- /dev/null +++ b/proto/rill/runtime/v1/expression.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; +package rill.runtime.v1; + +import "google/protobuf/struct.proto"; +import "validate/validate.proto"; + +message Expression { + oneof expression { + string ident = 1; + google.protobuf.Value val = 2; + Condition cond = 3; + } +} + +message Condition { + Operation op = 1 [(validate.rules).enum.defined_only = true]; + repeated Expression exprs = 2; +} + +enum Operation { + OPERATION_UNSPECIFIED = 0; + OPERATION_EQ = 1; + OPERATION_NEQ = 2; + OPERATION_LT = 3; + OPERATION_LTE = 4; + OPERATION_GT = 5; + OPERATION_GTE = 6; + OPERATION_OR = 7; + OPERATION_AND = 8; + OPERATION_IN = 9; + OPERATION_NIN = 10; + OPERATION_LIKE = 11; + OPERATION_NLIKE = 12; +} diff --git a/proto/rill/runtime/v1/queries.proto b/proto/rill/runtime/v1/queries.proto index 98d80359833..0155b306e6b 100644 --- a/proto/rill/runtime/v1/queries.proto +++ b/proto/rill/runtime/v1/queries.proto @@ -8,6 +8,7 @@ import "rill/runtime/v1/export_format.proto"; import "rill/runtime/v1/schema.proto"; import "rill/runtime/v1/time_grain.proto"; import "validate/validate.proto"; +import "rill/runtime/v1/expression.proto"; service QueryService { // Query runs a SQL query against the instance's OLAP datastore. @@ -279,10 +280,12 @@ message MetricsViewAggregationRequest { TimeRange time_range = 12; google.protobuf.Timestamp time_start = 6; // Deprecated in favor of time_range google.protobuf.Timestamp time_end = 7; // Deprecated in favor of time_range - MetricsViewFilter filter = 8; + Expression where = 8; + Expression having = 13; int64 limit = 9 [(validate.rules).int64.gte = 0]; int64 offset = 10 [(validate.rules).int64.gte = 0]; int32 priority = 11; + MetricsViewFilter filter = 14; // Deprecated. should be removed once UI is moved to use new filters } message MetricsViewAggregationResponse { @@ -302,17 +305,17 @@ message MetricsViewAggregationMeasure { repeated google.protobuf.Value builtin_measure_args = 3; } +message MetricsViewAggregationSort { + string name = 1; + bool desc = 2; +} + enum BuiltinMeasure { BUILTIN_MEASURE_UNSPECIFIED = 0; BUILTIN_MEASURE_COUNT = 1; BUILTIN_MEASURE_COUNT_DISTINCT = 2; } -message MetricsViewAggregationSort { - string name = 1; - bool desc = 2; -} - message MetricsViewToplistRequest { string instance_id = 1; string metrics_view_name = 2 [(validate.rules).string.min_len = 1]; @@ -324,8 +327,10 @@ message MetricsViewToplistRequest { int64 limit = 7 [(validate.rules).int64.gte = 0]; int64 offset = 8 [(validate.rules).int64.gte = 0]; repeated MetricsViewSort sort = 9; - MetricsViewFilter filter = 10; + Expression where = 10; + Expression having = 13; int32 priority = 11; + MetricsViewFilter filter = 14; // Deprecated. should be removed once UI is moved to use new filters } message MetricsViewToplistResponse { @@ -342,11 +347,14 @@ message MetricsViewComparisonRequest { repeated MetricsViewComparisonSort sort = 5; TimeRange time_range = 6; TimeRange comparison_time_range = 7; - MetricsViewFilter filter = 8; + Expression where = 8; + Expression having = 12; + repeated MetricsViewComparisonMeasureAlias aliases = 15; int64 limit = 9 [(validate.rules).int64.gte = 0]; int64 offset = 10 [(validate.rules).int64.gte = 0]; int32 priority = 11; bool exact = 13; + MetricsViewFilter filter = 14; // Deprecated. should be removed once UI is moved to use new filters } // Response message for QueryService.MetricsViewComparison @@ -363,6 +371,7 @@ message TimeRange { string time_zone = 6; } +// Present for backwards compatibility enum MetricsViewComparisonSortType { METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED = 0; METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE = 1; @@ -371,10 +380,19 @@ enum MetricsViewComparisonSortType { METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA = 4; } +enum MetricsViewComparisonMeasureType { + METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED = 0; + METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE = 1; + METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE = 2; + METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA = 3; + METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA = 4; +} + message MetricsViewComparisonSort { string name = 1 [(validate.rules).string.min_len = 1]; bool desc = 2; - MetricsViewComparisonSortType type = 3; + MetricsViewComparisonSortType type = 3; // Deprecated. Present for backwards compatibility for older reports + MetricsViewComparisonMeasureType sort_type = 4; } message MetricsViewComparisonRow { @@ -390,6 +408,12 @@ message MetricsViewComparisonValue { google.protobuf.Value delta_rel = 5; } +message MetricsViewComparisonMeasureAlias { + string name = 1; + MetricsViewComparisonMeasureType type = 2; + string alias = 3; +} + message MetricsViewTimeSeriesRequest { string instance_id = 1; string metrics_view_name = 2 [(validate.rules).string.min_len = 1]; @@ -398,9 +422,11 @@ message MetricsViewTimeSeriesRequest { google.protobuf.Timestamp time_start = 4; google.protobuf.Timestamp time_end = 5; TimeGrain time_granularity = 6; - MetricsViewFilter filter = 7; + Expression where = 7; + Expression having = 11; string time_zone = 10; int32 priority = 8; + MetricsViewFilter filter = 12; // Deprecated. should be removed once UI is moved to use new filters } message MetricsViewTimeSeriesResponse { @@ -415,8 +441,9 @@ message MetricsViewTotalsRequest { repeated InlineMeasure inline_measures = 9; google.protobuf.Timestamp time_start = 4; google.protobuf.Timestamp time_end = 5; - MetricsViewFilter filter = 7; + Expression where = 7; int32 priority = 8; + MetricsViewFilter filter = 10; // Deprecated. should be removed once UI is moved to use new filters } message MetricsViewTotalsResponse { @@ -430,12 +457,13 @@ message MetricsViewRowsRequest { google.protobuf.Timestamp time_start = 3; google.protobuf.Timestamp time_end = 4; TimeGrain time_granularity = 10; - MetricsViewFilter filter = 5; + Expression where = 5; repeated MetricsViewSort sort = 6; int32 limit = 7 [(validate.rules).int32.gte = 0]; int64 offset = 8 [(validate.rules).int64.gte = 0]; int32 priority = 9; string time_zone = 11; + MetricsViewFilter filter = 12; // Deprecated. should be removed once UI is moved to use new filters } message MetricsViewRowsResponse { diff --git a/runtime/pkg/expressionpb/expressionpb.go b/runtime/pkg/expressionpb/expressionpb.go new file mode 100644 index 00000000000..058dadb5516 --- /dev/null +++ b/runtime/pkg/expressionpb/expressionpb.go @@ -0,0 +1,92 @@ +package expressionpb + +import ( + "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "google.golang.org/protobuf/types/known/structpb" +) + +/** + * Helper utils to simplify using the expression structures. + */ + +func Identifier(col string) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Ident{ + Ident: col, + }, + } +} + +func Value(val *structpb.Value) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Val{ + Val: val, + }, + } +} + +func In(col *runtimev1.Expression, values []*runtimev1.Expression) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_IN, + Exprs: append([]*runtimev1.Expression{col}, values...), + }, + }, + } +} + +func NotIn(col *runtimev1.Expression, values []*runtimev1.Expression) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_NIN, + Exprs: append([]*runtimev1.Expression{col}, values...), + }, + }, + } +} + +func Like(col, val *runtimev1.Expression) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_LIKE, + Exprs: []*runtimev1.Expression{col, val}, + }, + }, + } +} + +func NotLike(col, val *runtimev1.Expression) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_NLIKE, + Exprs: []*runtimev1.Expression{col, val}, + }, + }, + } +} + +func And(values []*runtimev1.Expression) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_AND, + Exprs: values, + }, + }, + } +} + +func Or(values []*runtimev1.Expression) *runtimev1.Expression { + return &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_OR, + Exprs: values, + }, + }, + } +} diff --git a/runtime/queries/metricsview.go b/runtime/queries/metricsview.go index 421e3ec4363..d3e7379be45 100644 --- a/runtime/queries/metricsview.go +++ b/runtime/queries/metricsview.go @@ -17,6 +17,7 @@ import ( runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime" "github.com/rilldata/rill/runtime/drivers" + "github.com/rilldata/rill/runtime/pkg/expressionpb" "github.com/rilldata/rill/runtime/pkg/pbutil" "github.com/xuri/excelize/v2" "google.golang.org/grpc/codes" @@ -292,6 +293,342 @@ func buildFilterClauseForCondition(mv *runtimev1.MetricsViewSpec, cond *runtimev return fmt.Sprintf("AND (%s) ", condsClause), args, nil } +func columnIdentifierExpression(mv *runtimev1.MetricsViewSpec, aliases []*runtimev1.MetricsViewComparisonMeasureAlias, name string, dialect drivers.Dialect) (string, bool) { + // check if identifier is a dimension + for _, dim := range mv.Dimensions { + if dim.Name == name { + return safeName(metricsViewDimensionColumn(dim)), true + } + } + + // check if identifier is passed as an alias + for _, alias := range aliases { + if alias.Alias == name { + switch alias.Type { + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE: + return safeName(alias.Name), true + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE: + return safeName(alias.Name + "__previous"), true + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA: + return safeName(alias.Name + "__delta_abs"), true + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA: + return safeName(alias.Name + "__delta_rel"), true + } + } + } + + // check if identifier is measure but not passed as alias + for _, mes := range mv.Measures { + if mes.Name == name { + return safeName(mes.Name), true + } + } + + return "", false +} + +func identifierIsUnnest(mv *runtimev1.MetricsViewSpec, expr *runtimev1.Expression) bool { + ident, isIdent := expr.Expression.(*runtimev1.Expression_Ident) + if isIdent { + for _, dim := range mv.Dimensions { + if dim.Name == ident.Ident { + return dim.Unnest + } + } + } + return false +} + +func buildExpression(mv *runtimev1.MetricsViewSpec, expr *runtimev1.Expression, aliases []*runtimev1.MetricsViewComparisonMeasureAlias, dialect drivers.Dialect) (string, []any, error) { + var emptyArg []any + switch e := expr.Expression.(type) { + case *runtimev1.Expression_Val: + arg, err := pbutil.FromValue(e.Val) + if err != nil { + return "", emptyArg, err + } + return "?", []any{arg}, nil + + case *runtimev1.Expression_Ident: + expr, isIdent := columnIdentifierExpression(mv, aliases, e.Ident, dialect) + if !isIdent { + return "", emptyArg, fmt.Errorf("unknown column filter: %s", e.Ident) + } + return expr, emptyArg, nil + + case *runtimev1.Expression_Cond: + return buildConditionExpression(mv, e.Cond, aliases, dialect) + } + + return "", emptyArg, nil +} + +func buildConditionExpression(mv *runtimev1.MetricsViewSpec, cond *runtimev1.Condition, aliases []*runtimev1.MetricsViewComparisonMeasureAlias, dialect drivers.Dialect) (string, []any, error) { + switch cond.Op { + case runtimev1.Operation_OPERATION_LIKE, runtimev1.Operation_OPERATION_NLIKE: + return buildLikeExpression(mv, cond, aliases, dialect) + + case runtimev1.Operation_OPERATION_IN, runtimev1.Operation_OPERATION_NIN: + return buildInExpression(mv, cond, aliases, dialect) + + case runtimev1.Operation_OPERATION_AND: + return buildAndOrExpressions(mv, cond, aliases, dialect, " AND ") + + case runtimev1.Operation_OPERATION_OR: + return buildAndOrExpressions(mv, cond, aliases, dialect, " OR ") + + default: + leftExpr, args, err := buildExpression(mv, cond.Exprs[0], aliases, dialect) + if err != nil { + return "", nil, err + } + + rightExpr, subArgs, err := buildExpression(mv, cond.Exprs[1], aliases, dialect) + if err != nil { + return "", nil, err + } + args = append(args, subArgs...) + + return fmt.Sprintf("(%s) %s (%s)", leftExpr, conditionExpressionOperation(cond.Op), rightExpr), args, nil + } +} + +func buildLikeExpression(mv *runtimev1.MetricsViewSpec, cond *runtimev1.Condition, aliases []*runtimev1.MetricsViewComparisonMeasureAlias, dialect drivers.Dialect) (string, []any, error) { + if len(cond.Exprs) != 2 { + return "", nil, fmt.Errorf("like/not like expression should have exactly 2 sub expressions") + } + + leftExpr, args, err := buildExpression(mv, cond.Exprs[0], aliases, dialect) + if err != nil { + return "", nil, err + } + + rightExpr, subArgs, err := buildExpression(mv, cond.Exprs[1], aliases, dialect) + if err != nil { + return "", nil, err + } + args = append(args, subArgs...) + + notKeyword := "" + if cond.Op == runtimev1.Operation_OPERATION_NLIKE { + notKeyword = "NOT" + } + + // identify if immediate identifier has unnest + unnest := identifierIsUnnest(mv, cond.Exprs[0]) + + var clause string + // Build [NOT] len(list_filter("dim", x -> x ILIKE ?)) > 0 + if unnest && dialect != drivers.DialectDruid { + clause = fmt.Sprintf("%s len(list_filter(%s, x -> x %s ILIKE %s)) > 0", notKeyword, leftExpr, notKeyword, rightExpr) + } else { + if dialect == drivers.DialectDruid { + // Druid does not support ILIKE + clause = fmt.Sprintf("LOWER(%s) %s LIKE LOWER(%s)", leftExpr, notKeyword, rightExpr) + } else { + clause = fmt.Sprintf("%s %s ILIKE %s", leftExpr, notKeyword, rightExpr) + } + } + + // When you have "dim NOT ILIKE '...'", then NULL values are always excluded. + // We need to explicitly include it. + if cond.Op == runtimev1.Operation_OPERATION_NLIKE { + clause += fmt.Sprintf(" OR %s IS NULL", leftExpr) + } + + return clause, args, nil +} + +func buildInExpression(mv *runtimev1.MetricsViewSpec, cond *runtimev1.Condition, aliases []*runtimev1.MetricsViewComparisonMeasureAlias, dialect drivers.Dialect) (string, []any, error) { + if len(cond.Exprs) <= 1 { + return "", nil, fmt.Errorf("in/not in expression should have atleast 2 sub expressions") + } + + leftExpr, args, err := buildExpression(mv, cond.Exprs[0], aliases, dialect) + if err != nil { + return "", nil, err + } + + notKeyword := "" + exclude := cond.Op == runtimev1.Operation_OPERATION_NIN + if exclude { + notKeyword = "NOT" + } + + inHasNull := false + var valClauses []string + // Add to args, skipping nulls + for _, subExpr := range cond.Exprs[1:] { + if v, isVal := subExpr.Expression.(*runtimev1.Expression_Val); isVal { + if _, isNull := v.Val.Kind.(*structpb.Value_NullValue); isNull { + inHasNull = true + continue // Handled later using "dim IS [NOT] NULL" clause + } + } + inVal, subArgs, err := buildExpression(mv, subExpr, aliases, dialect) + if err != nil { + return "", nil, err + } + args = append(args, subArgs...) + valClauses = append(valClauses, inVal) + } + + // identify if immediate identifier has unnest + unnest := identifierIsUnnest(mv, cond.Exprs[0]) + + clauses := make([]string, 0) + + // If there were non-null args, add a "dim [NOT] IN (...)" clause + if len(valClauses) > 0 { + questionMarks := strings.Join(valClauses, ",") + var clause string + // Build [NOT] list_has_any("dim", ARRAY[?, ?, ...]) + if unnest && dialect != drivers.DialectDruid { + clause = fmt.Sprintf("%s list_has_any(%s, ARRAY[%s])", notKeyword, leftExpr, questionMarks) + } else { + clause = fmt.Sprintf("%s %s IN (%s)", leftExpr, notKeyword, questionMarks) + } + clauses = append(clauses, clause) + } + + if inHasNull { + // Add null check + // NOTE: DuckDB doesn't handle NULL values in an "IN" expression. They must be checked with a "dim IS [NOT] NULL" clause. + clauses = append(clauses, fmt.Sprintf("%s IS %s NULL", leftExpr, notKeyword)) + } + var condsClause string + if exclude { + condsClause = strings.Join(clauses, " AND ") + } else { + condsClause = strings.Join(clauses, " OR ") + } + if exclude && !inHasNull && len(clauses) > 0 { + // When you have "dim NOT IN (a, b, ...)", then NULL values are always excluded, even if NULL is not in the list. + // E.g. this returns zero rows: "select * from (select 1 as a union select null as a) where a not in (1)" + // We need to explicitly include it. + condsClause += fmt.Sprintf(" OR %s IS NULL", leftExpr) + } + + return condsClause, args, nil +} + +func buildAndOrExpressions(mv *runtimev1.MetricsViewSpec, cond *runtimev1.Condition, aliases []*runtimev1.MetricsViewComparisonMeasureAlias, dialect drivers.Dialect, joiner string) (string, []any, error) { + clauses := make([]string, 0) + var args []any + for _, expr := range cond.Exprs { + clause, subArgs, err := buildExpression(mv, expr, aliases, dialect) + if err != nil { + return "", nil, err + } + args = append(args, subArgs...) + clauses = append(clauses, fmt.Sprintf("(%s)", clause)) + } + return strings.Join(clauses, joiner), args, nil +} + +func conditionExpressionOperation(oprn runtimev1.Operation) string { + switch oprn { + case runtimev1.Operation_OPERATION_EQ: + return "=" + case runtimev1.Operation_OPERATION_NEQ: + return "!=" + case runtimev1.Operation_OPERATION_LT: + return "<" + case runtimev1.Operation_OPERATION_LTE: + return "<=" + case runtimev1.Operation_OPERATION_GT: + return ">" + case runtimev1.Operation_OPERATION_GTE: + return ">=" + } + panic(fmt.Sprintf("unknown condition operation: %v", oprn)) +} + +func convertFilterToExpression(filter *runtimev1.MetricsViewFilter) *runtimev1.Expression { + var exprs []*runtimev1.Expression + + if len(filter.Include) > 0 { + var includeExprs []*runtimev1.Expression + for _, cond := range filter.Include { + domExpr := convertDimensionFilterToExpression(cond, false) + if domExpr != nil { + includeExprs = append(includeExprs, domExpr) + } + } + exprs = append(exprs, expressionpb.Or(includeExprs)) + } + + if len(filter.Exclude) > 0 { + for _, cond := range filter.Exclude { + domExpr := convertDimensionFilterToExpression(cond, true) + if domExpr != nil { + exprs = append(exprs, domExpr) + } + } + } + + if len(exprs) == 1 { + return exprs[0] + } else if len(exprs) > 1 { + return expressionpb.And(exprs) + } + return nil +} + +func convertDimensionFilterToExpression(cond *runtimev1.MetricsViewFilter_Cond, exclude bool) *runtimev1.Expression { + var inExpr *runtimev1.Expression + if len(cond.In) > 0 { + var inExprs []*runtimev1.Expression + for _, inVal := range cond.In { + inExprs = append(inExprs, expressionpb.Value(inVal)) + } + if exclude { + inExpr = expressionpb.NotIn(expressionpb.Identifier(cond.Name), inExprs) + } else { + inExpr = expressionpb.In(expressionpb.Identifier(cond.Name), inExprs) + } + } + + var likeExpr *runtimev1.Expression + if len(cond.Like) == 1 { + if exclude { + likeExpr = expressionpb.NotLike(expressionpb.Identifier(cond.Name), expressionpb.Value(structpb.NewStringValue(cond.Like[0]))) + } else { + likeExpr = expressionpb.Like(expressionpb.Identifier(cond.Name), expressionpb.Value(structpb.NewStringValue(cond.Like[0]))) + } + } else if len(cond.Like) > 1 { + var likeExprs []*runtimev1.Expression + for _, l := range cond.Like { + col := expressionpb.Identifier(cond.Name) + val := expressionpb.Value(structpb.NewStringValue(l)) + if exclude { + likeExprs = append(likeExprs, expressionpb.NotLike(col, val)) + } else { + likeExprs = append(likeExprs, expressionpb.Like(col, val)) + } + } + if exclude { + likeExpr = expressionpb.And(likeExprs) + } else { + likeExpr = expressionpb.Or(likeExprs) + } + } + + if inExpr != nil && likeExpr != nil { + if exclude { + return expressionpb.And([]*runtimev1.Expression{inExpr, likeExpr}) + } + return expressionpb.Or([]*runtimev1.Expression{inExpr, likeExpr}) + } else if inExpr != nil { + return inExpr + } else if likeExpr != nil { + return likeExpr + } + + return nil +} + func repeatString(val string, n int) []string { res := make([]string, n) for i := 0; i < n; i++ { @@ -612,7 +949,7 @@ func duckDBCopyExport(ctx context.Context, w io.Writer, opts *runtime.ExportOpti func (q *MetricsViewRows) generateFilename(mv *runtimev1.MetricsViewSpec) string { filename := strings.ReplaceAll(mv.Table, `"`, `_`) - if q.TimeStart != nil || q.TimeEnd != nil || q.Filter != nil && (len(q.Filter.Include) > 0 || len(q.Filter.Exclude) > 0) { + if q.TimeStart != nil || q.TimeEnd != nil || q.Where != nil { filename += "_filtered" } return filename diff --git a/runtime/queries/metricsview_aggregation.go b/runtime/queries/metricsview_aggregation.go index 5185ca561d0..5f0d971b975 100644 --- a/runtime/queries/metricsview_aggregation.go +++ b/runtime/queries/metricsview_aggregation.go @@ -19,13 +19,17 @@ type MetricsViewAggregation struct { Measures []*runtimev1.MetricsViewAggregationMeasure `json:"measures,omitempty"` Sort []*runtimev1.MetricsViewAggregationSort `json:"sort,omitempty"` TimeRange *runtimev1.TimeRange `json:"time_range,omitempty"` - Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Where *runtimev1.Expression `json:"where,omitempty"` + Having *runtimev1.Expression `json:"having,omitempty"` Priority int32 `json:"priority,omitempty"` Limit *int64 `json:"limit,omitempty"` Offset int64 `json:"offset,omitempty"` MetricsView *runtimev1.MetricsViewSpec `json:"-"` ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` + // backwards compatibility + Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Result *runtimev1.MetricsViewAggregationResponse `json:"-"` } @@ -76,6 +80,14 @@ func (q *MetricsViewAggregation) Resolve(ctx context.Context, rt *runtime.Runtim return fmt.Errorf("metrics view '%s' does not have a time dimension", q.MetricsView) } + // backwards compatibility + if q.Filter != nil { + if q.Where != nil { + return fmt.Errorf("both filter and where is provided") + } + q.Where = convertFilterToExpression(q.Filter) + } + // Build query sql, args, err := q.buildMetricsAggregationSQL(q.MetricsView, olap.Dialect(), q.ResolvedMVSecurity) if err != nil { @@ -103,7 +115,7 @@ func (q *MetricsViewAggregation) Export(ctx context.Context, rt *runtime.Runtime } filename := strings.ReplaceAll(q.MetricsView.Table, `"`, `_`) - if !isTimeRangeNil(q.TimeRange) || q.Filter != nil && (len(q.Filter.Include) > 0 || len(q.Filter.Exclude) > 0) { + if !isTimeRangeNil(q.TimeRange) || q.Where != nil || q.Having != nil { filename += "_filtered" } @@ -210,18 +222,30 @@ func (q *MetricsViewAggregation) buildMetricsAggregationSQL(mv *runtimev1.Metric } whereClause += clause } - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, dialect) if err != nil { return "", nil, err } - whereClause += " " + clause + whereClause += " AND " + clause args = append(args, clauseArgs...) } if len(whereClause) > 0 { whereClause = "WHERE 1=1" + whereClause } + havingClause := "" + if q.Having != nil { + var havingClauseArgs []any + var err error + havingClause, havingClauseArgs, err = buildExpression(mv, q.Having, nil, dialect) + if err != nil { + return "", nil, err + } + havingClause = "HAVING " + havingClause + args = append(args, havingClauseArgs...) + } + sortingCriteria := make([]string, 0, len(q.Sort)) for _, s := range q.Sort { sortCriterion := safeName(s.Name) @@ -246,12 +270,13 @@ func (q *MetricsViewAggregation) buildMetricsAggregationSQL(mv *runtimev1.Metric limitClause = fmt.Sprintf("LIMIT %d", *q.Limit) } - sql := fmt.Sprintf("SELECT %s FROM %s %s %s %s %s %s OFFSET %d", + sql := fmt.Sprintf("SELECT %s FROM %s %s %s %s %s %s %s OFFSET %d", strings.Join(selectCols, ", "), safeName(mv.Table), strings.Join(unnestClauses, ""), whereClause, groupClause, + havingClause, orderClause, limitClause, q.Offset, diff --git a/runtime/queries/metricsview_aggregation_test.go b/runtime/queries/metricsview_aggregation_test.go new file mode 100644 index 00000000000..57deafafca7 --- /dev/null +++ b/runtime/queries/metricsview_aggregation_test.go @@ -0,0 +1,87 @@ +package queries_test + +import ( + "context" + "testing" + + runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/rilldata/rill/runtime" + "github.com/rilldata/rill/runtime/queries" + "github.com/rilldata/rill/runtime/testruntime" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestMetricsViewAggregation_measure_filters(t *testing.T) { + rt, instanceID := testruntime.NewInstanceForProject(t, "ad_bids") + + ctr := &queries.ColumnTimeRange{ + TableName: "ad_bids", + ColumnName: "timestamp", + } + err := ctr.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + diff := ctr.Result.Max.AsTime().Sub(ctr.Result.Min.AsTime()) + maxTime := ctr.Result.Min.AsTime().Add(diff / 2) + + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(t, err) + r, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "ad_bids_metrics"}, false) + require.NoError(t, err) + mv := r.GetMetricsView() + + lmt := int64(250) + q := &queries.MetricsViewAggregation{ + MetricsViewName: "ad_bids_metrics", + Dimensions: []*runtimev1.MetricsViewAggregationDimension{ + { + Name: "dom", + }, + }, + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + { + Name: "measure_1", + }, + }, + MetricsView: mv.Spec, + TimeRange: &runtimev1.TimeRange{ + Start: ctr.Result.Min, + End: timestamppb.New(maxTime), + }, + Sort: []*runtimev1.MetricsViewAggregationSort{ + { + Name: "dom", + Desc: true, + }, + }, + Limit: &lmt, + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_GT, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "measure_1", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(3.25), + }, + }, + }, + }, + }, + }, + } + + err = q.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + require.NotEmpty(t, q.Result) + require.Len(t, q.Result.Data, 3) + require.NotEmpty(t, "sports.yahoo.com", q.Result.Data[0].AsMap()["dom"]) + require.NotEmpty(t, "news.google.com", q.Result.Data[1].AsMap()["dom"]) + require.NotEmpty(t, "instagram.com", q.Result.Data[2].AsMap()["dom"]) +} diff --git a/runtime/queries/metricsview_comparison_toplist.go b/runtime/queries/metricsview_comparison_toplist.go index 29d365aadb3..cde2376a307 100644 --- a/runtime/queries/metricsview_comparison_toplist.go +++ b/runtime/queries/metricsview_comparison_toplist.go @@ -18,18 +18,23 @@ import ( ) type MetricsViewComparison struct { - MetricsViewName string `json:"metrics_view_name,omitempty"` - DimensionName string `json:"dimension_name,omitempty"` - Measures []*runtimev1.MetricsViewAggregationMeasure `json:"measures,omitempty"` - TimeRange *runtimev1.TimeRange `json:"base_time_range,omitempty"` - ComparisonTimeRange *runtimev1.TimeRange `json:"comparison_time_range,omitempty"` - Limit int64 `json:"limit,omitempty"` - Offset int64 `json:"offset,omitempty"` - Sort []*runtimev1.MetricsViewComparisonSort `json:"sort,omitempty"` - Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` - MetricsView *runtimev1.MetricsViewSpec `json:"-"` - ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` - Exact bool `json:"exact"` + MetricsViewName string `json:"metrics_view_name,omitempty"` + DimensionName string `json:"dimension_name,omitempty"` + Measures []*runtimev1.MetricsViewAggregationMeasure `json:"measures,omitempty"` + TimeRange *runtimev1.TimeRange `json:"base_time_range,omitempty"` + ComparisonTimeRange *runtimev1.TimeRange `json:"comparison_time_range,omitempty"` + Limit int64 `json:"limit,omitempty"` + Offset int64 `json:"offset,omitempty"` + Sort []*runtimev1.MetricsViewComparisonSort `json:"sort,omitempty"` + Where *runtimev1.Expression `json:"where,omitempty"` + Having *runtimev1.Expression `json:"having,omitempty"` + Aliases []*runtimev1.MetricsViewComparisonMeasureAlias `json:"aliases,omitempty"` + MetricsView *runtimev1.MetricsViewSpec `json:"-"` + ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` + Exact bool `json:"exact"` + + // backwards compatibility + Filter *runtimev1.MetricsViewFilter `json:"filter"` Result *runtimev1.MetricsViewComparisonResponse `json:"-"` } @@ -86,6 +91,14 @@ func (q *MetricsViewComparison) Resolve(ctx context.Context, rt *runtime.Runtime return err } + // backwards compatibility + if q.Filter != nil { + if q.Where != nil { + return fmt.Errorf("both filter and where is provided") + } + q.Where = convertFilterToExpression(q.Filter) + } + if !isTimeRangeNil(q.ComparisonTimeRange) { return q.executeComparisonToplist(ctx, olap, q.MetricsView, priority, q.ResolvedMVSecurity) } @@ -279,6 +292,13 @@ func (q *MetricsViewComparison) buildMetricsTopListSQL(mv *runtimev1.MetricsView } } + if q.Aliases != nil { + err = validateMeasureAliases(q.Aliases, false) + if err != nil { + return "", nil, err + } + } + selectClause := strings.Join(selectCols, ", ") baseWhereClause := "1=1" @@ -291,16 +311,27 @@ func (q *MetricsViewComparison) buildMetricsTopListSQL(mv *runtimev1.MetricsView } baseWhereClause += trc - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, dialect) if err != nil { return "", nil, err } - baseWhereClause += " " + clause + baseWhereClause += " AND " + clause args = append(args, clauseArgs...) } + havingClause := "" + if q.Having != nil { + var havingClauseArgs []any + havingClause, havingClauseArgs, err = buildExpression(mv, q.Having, q.Aliases, dialect) + if err != nil { + return "", nil, err + } + havingClause = "HAVING " + havingClause + args = append(args, havingClauseArgs...) + } + var orderClauses []string for _, s := range q.Sort { if s.Name == q.DimensionName { @@ -343,7 +374,7 @@ func (q *MetricsViewComparison) buildMetricsTopListSQL(mv *runtimev1.MetricsView if export { labelSelectClause := strings.Join(labelCols, ", ") sql = fmt.Sprintf( - `SELECT %[9]s FROM (SELECT %[1]s FROM %[3]s %[8]s WHERE %[4]s GROUP BY %[2]s %[5]s %[6]s OFFSET %[7]d)`, + `SELECT %[9]s FROM (SELECT %[1]s FROM %[3]s %[8]s WHERE %[4]s GROUP BY %[2]s %[10]s %[5]s %[6]s OFFSET %[7]d)`, selectClause, // 1 groupByCol, // 2 safeName(mv.Table), // 3 @@ -353,10 +384,11 @@ func (q *MetricsViewComparison) buildMetricsTopListSQL(mv *runtimev1.MetricsView q.Offset, // 7 unnestClause, // 8 labelSelectClause, // 9 + havingClause, // 10 ) } else { sql = fmt.Sprintf( - `SELECT %[1]s FROM %[3]s %[8]s WHERE %[4]s GROUP BY %[2]s %[5]s %[6]s OFFSET %[7]d`, + `SELECT %[1]s FROM %[3]s %[8]s WHERE %[4]s GROUP BY %[2]s %[9]s %[5]s %[6]s OFFSET %[7]d`, selectClause, // 1 groupByCol, // 2 safeName(mv.Table), // 3 @@ -365,6 +397,7 @@ func (q *MetricsViewComparison) buildMetricsTopListSQL(mv *runtimev1.MetricsView limitClause, // 6 q.Offset, // 7 unnestClause, // 8 + havingClause, // 9 ) } @@ -432,7 +465,7 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M var labelTuple string if dialect != drivers.DialectDruid { columnsTuple = fmt.Sprintf( - "base.%[1]s, comparison.%[1]s AS %[2]s, base.%[1]s - comparison.%[1]s AS %[3]s, (base.%[1]s - comparison.%[1]s)/comparison.%[1]s::DOUBLE AS %[4]s", + "base.%[1]s AS %[1]s, comparison.%[1]s AS %[2]s, base.%[1]s - comparison.%[1]s AS %[3]s, (base.%[1]s - comparison.%[1]s)/comparison.%[1]s::DOUBLE AS %[4]s", safeName(m.Name), safeName(m.Name+"__previous"), safeName(m.Name+"__delta_abs"), @@ -448,8 +481,11 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M ) } else { columnsTuple = fmt.Sprintf( - "ANY_VALUE(base.%[1]s), ANY_VALUE(comparison.%[1]s), ANY_VALUE(base.%[1]s - comparison.%[1]s), ANY_VALUE(SAFE_DIVIDE(base.%[1]s - comparison.%[1]s, CAST(comparison.%[1]s AS DOUBLE)))", + "ANY_VALUE(base.%[1]s) AS %[1]s, ANY_VALUE(comparison.%[1]s) AS %[2]s, ANY_VALUE(base.%[1]s - comparison.%[1]s) AS %[3]s, ANY_VALUE(SAFE_DIVIDE(base.%[1]s - comparison.%[1]s, CAST(comparison.%[1]s AS DOUBLE))) AS %[4]s", safeName(m.Name), + safeName(m.Name+"__previous"), + safeName(m.Name+"__delta_abs"), + safeName(m.Name+"__delta_rel"), ) labelTuple = fmt.Sprintf( "ANY_VALUE(base.%[1]s) AS %[2]s, ANY_VALUE(comparison.%[1]s) AS %[3]s, ANY_VALUE(base.%[1]s - comparison.%[1]s) AS %[4]s, ANY_VALUE(SAFE_DIVIDE(base.%[1]s - comparison.%[1]s, CAST(comparison.%[1]s AS DOUBLE))) AS %[5]s", @@ -467,6 +503,13 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M labelCols = append(labelCols, labelTuple) } + if q.Aliases != nil { + err = validateMeasureAliases(q.Aliases, true) + if err != nil { + return "", nil, err + } + } + subSelectClause := strings.Join(selectCols, ", ") finalSelectClause := strings.Join(finalSelectCols, ", ") labelSelectClause := strings.Join(labelCols, ", ") @@ -490,12 +533,12 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M } baseWhereClause += trc - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, dialect) if err != nil { return "", nil, err } - baseWhereClause += " " + clause + baseWhereClause += " AND " + clause args = append(args, clauseArgs...) } @@ -506,21 +549,33 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M } comparisonWhereClause += trc - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, dialect) if err != nil { return "", nil, err } - comparisonWhereClause += " " + clause + comparisonWhereClause += " AND " + clause args = append(args, clauseArgs...) } + havingClause := "1=1" + if q.Having != nil { + var havingClauseArgs []any + havingClause, havingClauseArgs, err = buildExpression(mv, q.Having, q.Aliases, dialect) + if err != nil { + return "", nil, err + } + args = append(args, havingClauseArgs...) + } + err = validateSort(q.Sort) if err != nil { return "", nil, err } + // Update sort to make sure it is backwards compatible + updateComparisonSort(q.Sort) var orderClauses []string var subQueryOrderClauses []string for _, s := range q.Sort { @@ -546,14 +601,14 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M } var pos int - switch s.Type { - case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE: + switch s.SortType { + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE: pos = 2 + i*4 - case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE: + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE: pos = 3 + i*4 - case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA: + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA: pos = 4 + i*4 - case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA: + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA: pos = 5 + i*4 default: return "", nil, fmt.Errorf("undefined sort type for measure %s", s.Name) @@ -594,21 +649,21 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M joinType := "FULL" if !q.Exact { - deltaComparison := q.Sort[0].Type == runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA || - q.Sort[0].Type == runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA + deltaComparison := q.Sort[0].SortType == runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA || + q.Sort[0].SortType == runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA approximationLimit := q.Limit if q.Limit != 0 && q.Limit < 100 && deltaComparison { approximationLimit = 100 } - if q.Sort[0].Type == runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE || deltaComparison { + if q.Sort[0].SortType == runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE || deltaComparison { joinType = "LEFT OUTER" baseLimitClause = subQueryOrderByClause if approximationLimit > 0 { baseLimitClause += fmt.Sprintf(" LIMIT %d", approximationLimit) } - } else if q.Sort[0].Type == runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE { + } else if q.Sort[0].SortType == runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE { joinType = "RIGHT OUTER" comparisonLimitClause = subQueryOrderByClause if approximationLimit > 0 { @@ -646,7 +701,12 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M } var sql string if dialect != drivers.DialectDruid { - sql = fmt.Sprintf(` + if havingClause != "" { + // measure filter could include the base measure name. + // this leads to ambiguity whether it applies to the base.measure ot comparison.measure. + // to keep the clause builder consistent we add an outer query here. + sql = fmt.Sprintf(` + SELECT * from ( SELECT COALESCE(base.%[2]s, comparison.%[2]s) AS %[10]s, %[9]s FROM ( SELECT %[1]s FROM %[3]s %[14]s WHERE %[4]s GROUP BY %[15]s %[12]s @@ -661,23 +721,59 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M %[7]s OFFSET %[8]d + ) WHERE %[16]s `, - subSelectClause, // 1 - colName, // 2 - safeName(mv.Table), // 3 - baseWhereClause, // 4 - comparisonWhereClause, // 5 - orderByClause, // 6 - limitClause, // 7 - q.Offset, // 8 - finalSelectClause, // 9 - finalDimName, // 10 - joinType, // 11 - baseLimitClause, // 12 - comparisonLimitClause, // 13 - unnestClause, // 14 - groupByCol, // 15 - ) + subSelectClause, // 1 + colName, // 2 + safeName(mv.Table), // 3 + baseWhereClause, // 4 + comparisonWhereClause, // 5 + orderByClause, // 6 + limitClause, // 7 + q.Offset, // 8 + finalSelectClause, // 9 + finalDimName, // 10 + joinType, // 11 + baseLimitClause, // 12 + comparisonLimitClause, // 13 + unnestClause, // 14 + groupByCol, // 15 + havingClause, // 16 + ) + } else { + sql = fmt.Sprintf(` + SELECT COALESCE(base.%[2]s, comparison.%[2]s) AS %[10]s, %[9]s FROM + ( + SELECT %[1]s FROM %[3]s %[14]s WHERE %[4]s GROUP BY %[15]s %[12]s + ) base + %[11]s JOIN + ( + SELECT %[1]s FROM %[3]s %[14]s WHERE %[5]s GROUP BY %[15]s %[13]s + ) comparison + ON + base.%[2]s = comparison.%[2]s OR (base.%[2]s is null and comparison.%[2]s is null) + %[6]s + %[7]s + OFFSET + %[8]d + `, + subSelectClause, // 1 + colName, // 2 + safeName(mv.Table), // 3 + baseWhereClause, // 4 + comparisonWhereClause, // 5 + orderByClause, // 6 + limitClause, // 7 + q.Offset, // 8 + finalSelectClause, // 9 + finalDimName, // 10 + joinType, // 11 + baseLimitClause, // 12 + comparisonLimitClause, // 13 + unnestClause, // 14 + groupByCol, // 15 + ) + } } else { /* Example of the SQL query: @@ -722,7 +818,7 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M leftWhereClause := baseWhereClause rightWhereClause := comparisonWhereClause - if q.Sort[0].Type == runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE { + if q.Sort[0].SortType == runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE { leftSubQueryAlias = "comparison" rightSubQueryAlias = "base" leftWhereClause = comparisonWhereClause @@ -737,6 +833,7 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M ) SELECT %[11]s.%[2]s AS %[14]s, %[9]s FROM %[11]s LEFT JOIN %[12]s ON base.%[2]s = comparison.%[2]s GROUP BY 1 + HAVING %[15]s %[6]s %[7]s OFFSET %[8]d @@ -755,6 +852,7 @@ func (q *MetricsViewComparison) buildMetricsComparisonTopListSQL(mv *runtimev1.M rightSubQueryAlias, // 12 subQueryOrderByClause, // 13 finalDimName, // 14 + havingClause, // 15 ) } @@ -925,7 +1023,7 @@ func (q *MetricsViewComparison) generalExport(ctx context.Context, rt *runtime.R func (q *MetricsViewComparison) generateFilename() string { filename := strings.ReplaceAll(q.MetricsViewName, `"`, `_`) filename += "_" + q.DimensionName - if q.Filter != nil && (len(q.Filter.Include) > 0 || len(q.Filter.Exclude) > 0) { + if q.Where != nil || q.Having != nil { filename += "_filtered" } return filename @@ -974,3 +1072,34 @@ func validateSort(sorts []*runtimev1.MetricsViewComparisonSort) error { func isTimeRangeNil(tr *runtimev1.TimeRange) bool { return tr == nil || (tr.Start == nil && tr.End == nil) } + +func updateComparisonSort(sort []*runtimev1.MetricsViewComparisonSort) { + for _, comparisonSort := range sort { + if comparisonSort.SortType == runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED && comparisonSort.Type != runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED { + switch comparisonSort.Type { + case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE: + comparisonSort.SortType = runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE + case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE: + comparisonSort.SortType = runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE + case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA: + comparisonSort.SortType = runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA + case runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA: + comparisonSort.SortType = runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA + } + } + } +} + +func validateMeasureAliases(aliases []*runtimev1.MetricsViewComparisonMeasureAlias, hasComparison bool) error { + for _, alias := range aliases { + switch alias.Type { + case runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA: + if !hasComparison { + return fmt.Errorf("comparison not enabled for alias %s", alias.Alias) + } + } + } + return nil +} diff --git a/runtime/queries/metricsview_comparison_toplist_benchmark_test.go b/runtime/queries/metricsview_comparison_toplist_benchmark_test.go index dcd8f1772e3..8a49e7212f0 100644 --- a/runtime/queries/metricsview_comparison_toplist_benchmark_test.go +++ b/runtime/queries/metricsview_comparison_toplist_benchmark_test.go @@ -10,6 +10,7 @@ import ( "github.com/rilldata/rill/runtime/queries" "github.com/rilldata/rill/runtime/testruntime" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -50,9 +51,9 @@ func BenchmarkMetricsViewsComparison_compare(b *testing.B) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, @@ -98,9 +99,9 @@ func BenchmarkMetricsViewsComparison_nocompare_all(b *testing.B) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, @@ -144,9 +145,9 @@ func BenchmarkMetricsViewsComparison_compare_spending(b *testing.B) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, @@ -192,9 +193,9 @@ func BenchmarkMetricsViewsComparison_nocompare_all_spending(b *testing.B) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, @@ -245,10 +246,83 @@ func BenchmarkMetricsViewsComparison_delta_compare(b *testing.B) { End: ctr.Result.Max, }, Sort: []*runtimev1.MetricsViewComparisonSort{ + { + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, + }, + }, + Limit: 250, + Exact: true, + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + + err := q.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(b, err) + require.NotEmpty(b, q.Result) + } +} + +func BenchmarkMetricsViewsComparison_delta_compare_with_having(b *testing.B) { + rt, instanceID := testruntime.NewInstanceForProject(b, "ad_bids") + + ctr := &queries.ColumnTimeRange{ + TableName: "ad_bids", + ColumnName: "timestamp", + } + err := ctr.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(b, err) + diff := ctr.Result.Max.AsTime().Sub(ctr.Result.Min.AsTime()) + maxTime := ctr.Result.Min.AsTime().Add(diff / 2) + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(b, err) + res, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "ad_bids_metrics"}, false) + require.NoError(b, err) + mv := res.GetMetricsView().Spec + + q := &queries.MetricsViewComparison{ + MetricsViewName: "ad_bids_metrics", + DimensionName: "dom", + Measures: []*runtimev1.MetricsViewAggregationMeasure{ { Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + }, + }, + MetricsView: mv, + TimeRange: &runtimev1.TimeRange{ + Start: ctr.Result.Min, + End: timestamppb.New(maxTime), + }, + ComparisonTimeRange: &runtimev1.TimeRange{ + Start: timestamppb.New(maxTime), + End: ctr.Result.Max, + }, + Sort: []*runtimev1.MetricsViewComparisonSort{ + { + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, + }, + }, + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_GT, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "measure_1", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(3.25), + }, + }, + }, + }, }, }, Limit: 250, @@ -294,9 +368,9 @@ func BenchmarkMetricsViewsComparison_delta_nocompare_all(b *testing.B) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250, @@ -339,9 +413,9 @@ func BenchmarkMetricsViewsComparison_delta_compare_spending(b *testing.B) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250, @@ -387,9 +461,9 @@ func BenchmarkMetricsViewsComparison_delta_nocompare_all_spending(b *testing.B) }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250, @@ -432,9 +506,9 @@ func BenchmarkMetricsViewsComparison_delta_high_cardinality_compare_spending(b * }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250, @@ -477,9 +551,9 @@ func BenchmarkMetricsViewsComparison_delta_high_cardinality_compare_spending_app }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250, @@ -525,9 +599,9 @@ func BenchmarkMetricsViewsComparison_delta_high_cardinality_nocompare_all_spendi }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250, @@ -570,9 +644,9 @@ func BenchmarkMetricsViewsComparison_high_cardinality_compare_spending(b *testin }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, @@ -615,9 +689,9 @@ func BenchmarkMetricsViewsComparison_high_cardinality_compare_spending_approxima }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, @@ -660,9 +734,9 @@ func BenchmarkMetricsViewsComparison_delta_high_cardinality_compare_spending_app }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250 * 2, @@ -704,9 +778,9 @@ func BenchmarkMetricsViewsComparison_delta_high_cardinality_compare_spending_app }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 250 * 5, @@ -752,9 +826,9 @@ func BenchmarkMetricsViewsComparison_high_cardinality_nocompare_all_spending(b * }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "total_agencies", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "total_agencies", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, diff --git a/runtime/queries/metricsview_comparison_toplist_test.go b/runtime/queries/metricsview_comparison_toplist_test.go index 454141f86c6..e04e20cede3 100644 --- a/runtime/queries/metricsview_comparison_toplist_test.go +++ b/runtime/queries/metricsview_comparison_toplist_test.go @@ -12,6 +12,7 @@ import ( "github.com/rilldata/rill/runtime/testruntime" "github.com/stretchr/testify/require" "github.com/xuri/excelize/v2" + "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" // Register drivers @@ -51,9 +52,9 @@ func TestMetricsViewsComparison_dim_order_comparison_toplist_vs_general_toplist( }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "dom", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED, - Desc: false, + Name: "dom", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: false, }, }, Limit: 10, @@ -93,9 +94,9 @@ func TestMetricsViewsComparison_dim_order_comparison_toplist_vs_general_toplist( }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "dom", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: false, + Name: "dom", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: false, }, }, Limit: 10, @@ -151,9 +152,9 @@ func TestMetricsViewsComparison_dim_order(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "dom", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED, - Desc: true, + Name: "dom", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: true, }, }, Limit: 250, @@ -203,9 +204,9 @@ func TestMetricsViewsComparison_measure_order(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Limit: 250, @@ -218,6 +219,296 @@ func TestMetricsViewsComparison_measure_order(t *testing.T) { require.NotEmpty(t, "msn.com", q.Result.Rows[1].DimensionValue) } +func TestMetricsViewsComparison_measure_filters(t *testing.T) { + rt, instanceID := testruntime.NewInstanceForProject(t, "ad_bids") + + ctr := &queries.ColumnTimeRange{ + TableName: "ad_bids", + ColumnName: "timestamp", + } + err := ctr.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + diff := ctr.Result.Max.AsTime().Sub(ctr.Result.Min.AsTime()) + maxTime := ctr.Result.Min.AsTime().Add(diff / 2) + + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(t, err) + r, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "ad_bids_metrics"}, false) + require.NoError(t, err) + mv := r.GetMetricsView() + + q := &queries.MetricsViewComparison{ + MetricsViewName: "ad_bids_metrics", + DimensionName: "dom", + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + { + Name: "measure_1", + }, + }, + MetricsView: mv.Spec, + TimeRange: &runtimev1.TimeRange{ + Start: ctr.Result.Min, + End: timestamppb.New(maxTime), + }, + Sort: []*runtimev1.MetricsViewComparisonSort{ + { + Name: "dom", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: true, + }, + }, + Limit: 250, + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_GT, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "measure_1", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(3.25), + }, + }, + }, + }, + }, + }, + } + + err = q.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + require.NotEmpty(t, q.Result) + require.Len(t, q.Result.Rows, 3) + require.Equal(t, "sports.yahoo.com", q.Result.Rows[0].DimensionValue.GetStringValue()) + require.Equal(t, "news.google.com", q.Result.Rows[1].DimensionValue.GetStringValue()) + require.Equal(t, "instagram.com", q.Result.Rows[2].DimensionValue.GetStringValue()) +} + +func TestMetricsViewsComparison_measure_filters_with_compare_no_alias(t *testing.T) { + rt, instanceID := testruntime.NewInstanceForProject(t, "ad_bids") + + ctr := &queries.ColumnTimeRange{ + TableName: "ad_bids", + ColumnName: "timestamp", + } + err := ctr.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + diff := ctr.Result.Max.AsTime().Sub(ctr.Result.Min.AsTime()) + maxTime := ctr.Result.Min.AsTime().Add(diff / 2) + + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(t, err) + r, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "ad_bids_metrics"}, false) + require.NoError(t, err) + mv := r.GetMetricsView() + + q := &queries.MetricsViewComparison{ + MetricsViewName: "ad_bids_metrics", + DimensionName: "dom", + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + { + Name: "measure_1", + }, + }, + MetricsView: mv.Spec, + TimeRange: &runtimev1.TimeRange{ + Start: ctr.Result.Min, + End: timestamppb.New(maxTime), + }, + ComparisonTimeRange: &runtimev1.TimeRange{ + Start: timestamppb.New(maxTime), + End: ctr.Result.Max, + }, + Sort: []*runtimev1.MetricsViewComparisonSort{ + { + Name: "dom", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: true, + }, + }, + Limit: 250, + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_GT, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "measure_1__delta_rel", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(1.0), + }, + }, + }, + }, + }, + }, + } + + err = q.Resolve(context.Background(), rt, instanceID, 0) + require.ErrorContains(t, err, "unknown column filter: measure_1__delta_rel") +} + +func TestMetricsViewsComparison_measure_filters_with_compare_base_measure(t *testing.T) { + rt, instanceID := testruntime.NewInstanceForProject(t, "ad_bids") + + ctr := &queries.ColumnTimeRange{ + TableName: "ad_bids", + ColumnName: "timestamp", + } + err := ctr.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + diff := ctr.Result.Max.AsTime().Sub(ctr.Result.Min.AsTime()) + maxTime := ctr.Result.Min.AsTime().Add(diff / 2) + + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(t, err) + r, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "ad_bids_metrics"}, false) + require.NoError(t, err) + mv := r.GetMetricsView() + + q := &queries.MetricsViewComparison{ + MetricsViewName: "ad_bids_metrics", + DimensionName: "dom", + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + { + Name: "measure_1", + }, + }, + MetricsView: mv.Spec, + TimeRange: &runtimev1.TimeRange{ + Start: ctr.Result.Min, + End: timestamppb.New(maxTime), + }, + ComparisonTimeRange: &runtimev1.TimeRange{ + Start: timestamppb.New(maxTime), + End: ctr.Result.Max, + }, + Sort: []*runtimev1.MetricsViewComparisonSort{ + { + Name: "dom", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: true, + }, + }, + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_GT, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "measure_1", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(3.25), + }, + }, + }, + }, + }, + }, + Limit: 250, + } + + err = q.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + require.NotEmpty(t, q.Result) + require.Len(t, q.Result.Rows, 3) + require.Equal(t, "sports.yahoo.com", q.Result.Rows[0].DimensionValue.GetStringValue()) + require.Equal(t, "news.google.com", q.Result.Rows[1].DimensionValue.GetStringValue()) + require.Equal(t, "instagram.com", q.Result.Rows[2].DimensionValue.GetStringValue()) +} + +func TestMetricsViewsComparison_measure_filters_with_compare_aliases(t *testing.T) { + rt, instanceID := testruntime.NewInstanceForProject(t, "ad_bids") + + ctr := &queries.ColumnTimeRange{ + TableName: "ad_bids", + ColumnName: "timestamp", + } + err := ctr.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + diff := ctr.Result.Max.AsTime().Sub(ctr.Result.Min.AsTime()) + maxTime := ctr.Result.Min.AsTime().Add(diff / 2) + + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(t, err) + r, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "ad_bids_metrics"}, false) + require.NoError(t, err) + mv := r.GetMetricsView() + + q := &queries.MetricsViewComparison{ + MetricsViewName: "ad_bids_metrics", + DimensionName: "dom", + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + { + Name: "measure_1", + }, + }, + MetricsView: mv.Spec, + TimeRange: &runtimev1.TimeRange{ + Start: ctr.Result.Min, + End: timestamppb.New(maxTime), + }, + ComparisonTimeRange: &runtimev1.TimeRange{ + Start: timestamppb.New(maxTime), + End: ctr.Result.Max, + }, + Sort: []*runtimev1.MetricsViewComparisonSort{ + { + Name: "dom", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: true, + }, + }, + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_GT, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "measure_1_delta", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(1), + }, + }, + }, + }, + }, + }, + Aliases: []*runtimev1.MetricsViewComparisonMeasureAlias{ + { + Name: "measure_1", + Type: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA, + Alias: "measure_1_delta", + }, + }, + Limit: 250, + } + + err = q.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + require.NotEmpty(t, q.Result) + require.Len(t, q.Result.Rows, 3) + require.Equal(t, "sports.yahoo.com", q.Result.Rows[0].DimensionValue.GetStringValue()) + require.Equal(t, "news.google.com", q.Result.Rows[1].DimensionValue.GetStringValue()) + require.Equal(t, "instagram.com", q.Result.Rows[2].DimensionValue.GetStringValue()) +} + func TestMetricsViewsCompariso_export_xlsx(t *testing.T) { t.Parallel() rt, instanceId := testruntime.NewInstanceForProject(t, "ad_bids_2rows") @@ -252,9 +543,9 @@ func TestMetricsViewsCompariso_export_xlsx(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "domain", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED, - Desc: false, + Name: "domain", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: false, }, }, Limit: 10, @@ -310,9 +601,9 @@ func TestServer_MetricsViewTimeseries_export_csv(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "domain", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED, - Desc: false, + Name: "domain", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED, + Desc: false, }, }, Limit: 10, diff --git a/runtime/queries/metricsview_rows.go b/runtime/queries/metricsview_rows.go index b38e8702b33..bf428a357d6 100644 --- a/runtime/queries/metricsview_rows.go +++ b/runtime/queries/metricsview_rows.go @@ -19,7 +19,7 @@ type MetricsViewRows struct { TimeStart *timestamppb.Timestamp `json:"time_start,omitempty"` TimeEnd *timestamppb.Timestamp `json:"time_end,omitempty"` TimeGranularity runtimev1.TimeGrain `json:"time_granularity,omitempty"` - Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Where *runtimev1.Expression `json:"where,omitempty"` Sort []*runtimev1.MetricsViewSort `json:"sort,omitempty"` Limit *int64 `json:"limit,omitempty"` Offset int64 `json:"offset,omitempty"` @@ -27,6 +27,9 @@ type MetricsViewRows struct { MetricsView *runtimev1.MetricsViewSpec `json:"-"` ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` + // backwards compatibility + Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Result *runtimev1.MetricsViewRowsResponse `json:"-"` } @@ -82,6 +85,14 @@ func (q *MetricsViewRows) Resolve(ctx context.Context, rt *runtime.Runtime, inst return err } + // backwards compatibility + if q.Filter != nil { + if q.Where != nil { + return fmt.Errorf("both filter and where is provided") + } + q.Where = convertFilterToExpression(q.Filter) + } + ql, args, err := q.buildMetricsRowsSQL(q.MetricsView, olap.Dialect(), timeRollupColumnName, q.ResolvedMVSecurity) if err != nil { return fmt.Errorf("error building query: %w", err) @@ -228,12 +239,12 @@ func (q *MetricsViewRows) buildMetricsRowsSQL(mv *runtimev1.MetricsViewSpec, dia } } - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, dialect) if err != nil { return "", nil, err } - whereClause += " " + clause + whereClause += " AND " + clause args = append(args, clauseArgs...) } diff --git a/runtime/queries/metricsview_timeseries.go b/runtime/queries/metricsview_timeseries.go index ea2a2c8a617..7f73bc089a5 100644 --- a/runtime/queries/metricsview_timeseries.go +++ b/runtime/queries/metricsview_timeseries.go @@ -28,12 +28,16 @@ type MetricsViewTimeSeries struct { Limit int64 `json:"limit,omitempty"` Offset int64 `json:"offset,omitempty"` Sort []*runtimev1.MetricsViewSort `json:"sort,omitempty"` - Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Where *runtimev1.Expression `json:"where,omitempty"` + Having *runtimev1.Expression `json:"having,omitempty"` TimeGranularity runtimev1.TimeGrain `json:"time_granularity,omitempty"` TimeZone string `json:"time_zone,omitempty"` MetricsView *runtimev1.MetricsViewSpec `json:"-"` ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` + // backwards compatibility + Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Result *runtimev1.MetricsViewTimeSeriesResponse `json:"-"` } @@ -90,6 +94,14 @@ func (q *MetricsViewTimeSeries) Resolve(ctx context.Context, rt *runtime.Runtime return err } + // backwards compatibility + if q.Filter != nil { + if q.Where != nil { + return fmt.Errorf("both filter and where is provided") + } + q.Where = convertFilterToExpression(q.Filter) + } + mv := r.GetMetricsView().Spec sql, tsAlias, args, err := q.buildMetricsTimeseriesSQL(olap, mv, q.ResolvedMVSecurity) if err != nil { @@ -248,7 +260,7 @@ func (q *MetricsViewTimeSeries) Export(ctx context.Context, rt *runtime.Runtime, func (q *MetricsViewTimeSeries) generateFilename(mv *runtimev1.MetricsViewSpec) string { filename := strings.ReplaceAll(q.MetricsViewName, `"`, `_`) - if q.TimeStart != nil || q.TimeEnd != nil || q.Filter != nil && (len(q.Filter.Include) > 0 || len(q.Filter.Exclude) > 0) { + if q.TimeStart != nil || q.TimeEnd != nil || q.Where != nil || q.Having != nil { filename += "_filtered" } return filename @@ -277,12 +289,22 @@ func (q *MetricsViewTimeSeries) buildMetricsTimeseriesSQL(olap drivers.OLAPStore args = append(args, q.TimeEnd.AsTime()) } - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, olap.Dialect(), policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, olap.Dialect()) + if err != nil { + return "", "", nil, err + } + whereClause += " AND " + clause + args = append(args, clauseArgs...) + } + + havingClause := "" + if q.Having != nil { + clause, clauseArgs, err := buildExpression(mv, q.Having, nil, olap.Dialect()) if err != nil { return "", "", nil, err } - whereClause += " " + clause + havingClause = " HAVING " + clause args = append(args, clauseArgs...) } @@ -295,10 +317,10 @@ func (q *MetricsViewTimeSeries) buildMetricsTimeseriesSQL(olap drivers.OLAPStore var sql string switch olap.Dialect() { case drivers.DialectDuckDB: - sql = q.buildDuckDBSQL(mv, tsAlias, selectCols, whereClause, timezone) + sql = q.buildDuckDBSQL(mv, tsAlias, selectCols, whereClause, havingClause, timezone) case drivers.DialectDruid: args = append([]any{timezone}, args...) - sql = q.buildDruidSQL(args, mv, tsAlias, selectCols, whereClause) + sql = q.buildDruidSQL(args, mv, tsAlias, selectCols, whereClause, havingClause) default: return "", "", nil, fmt.Errorf("not available for dialect '%s'", olap.Dialect()) } @@ -306,7 +328,7 @@ func (q *MetricsViewTimeSeries) buildMetricsTimeseriesSQL(olap drivers.OLAPStore return sql, tsAlias, args, nil } -func (q *MetricsViewTimeSeries) buildDruidSQL(args []any, mv *runtimev1.MetricsViewSpec, tsAlias string, selectCols []string, whereClause string) string { +func (q *MetricsViewTimeSeries) buildDruidSQL(args []any, mv *runtimev1.MetricsViewSpec, tsAlias string, selectCols []string, whereClause, havingClause string) string { tsSpecifier := convertToDruidTimeFloorSpecifier(q.TimeGranularity) timeClause := fmt.Sprintf("time_floor(%s, '%s', null, CAST(? AS VARCHAR))", safeName(mv.TimeDimension), tsSpecifier) @@ -319,18 +341,19 @@ func (q *MetricsViewTimeSeries) buildDruidSQL(args []any, mv *runtimev1.MetricsV } sql := fmt.Sprintf( - `SELECT %s AS %s, %s FROM %s WHERE %s GROUP BY 1 ORDER BY 1`, + `SELECT %s AS %s, %s FROM %s WHERE %s GROUP BY 1 %s ORDER BY 1`, timeClause, tsAlias, strings.Join(selectCols, ", "), safeName(mv.Table), whereClause, + havingClause, ) return sql } -func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, tsAlias string, selectCols []string, whereClause, timezone string) string { +func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, tsAlias string, selectCols []string, whereClause, havingClause, timezone string) string { dateTruncSpecifier := convertToDateTruncSpecifier(q.TimeGranularity) shift := "" // shift to accommodate FirstDayOfWeek or FirstMonthOfYear @@ -354,7 +377,9 @@ func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, ts %[4]s FROM %[5]s WHERE %[6]s - GROUP BY 1 ORDER BY 1`, + GROUP BY 1 + %[8]s + ORDER BY 1`, dateTruncSpecifier, // 1 safeName(mv.TimeDimension), // 2 tsAlias, // 3 @@ -362,6 +387,7 @@ func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, ts safeName(mv.Table), // 5 whereClause, // 6 timezone, // 7 + havingClause, // 8 ) } else { // date_trunc is faster than time_bucket for year, month, week sql = fmt.Sprintf( @@ -371,7 +397,9 @@ func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, ts %[4]s FROM %[5]s WHERE %[6]s - GROUP BY 1 ORDER BY 1`, + GROUP BY 1 + %[8]s + ORDER BY 1`, dateTruncSpecifier, // 1 safeName(mv.TimeDimension), // 2 tsAlias, // 3 @@ -379,6 +407,7 @@ func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, ts safeName(mv.Table), // 5 whereClause, // 6 timezone, // 7 + havingClause, // 8 ) } } else { @@ -389,7 +418,9 @@ func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, ts %[4]s FROM %[5]s WHERE %[6]s - GROUP BY 1 ORDER BY 1`, + GROUP BY 1 + %[9]s + ORDER BY 1`, dateTruncSpecifier, // 1 safeName(mv.TimeDimension), // 2 tsAlias, // 3 @@ -398,6 +429,7 @@ func (q *MetricsViewTimeSeries) buildDuckDBSQL(mv *runtimev1.MetricsViewSpec, ts whereClause, // 6 timezone, // 7 shift, // 8 + havingClause, // 9 ) } diff --git a/runtime/queries/metricsview_timeseries_test.go b/runtime/queries/metricsview_timeseries_test.go index 3778ba75ee6..63038bf960a 100644 --- a/runtime/queries/metricsview_timeseries_test.go +++ b/runtime/queries/metricsview_timeseries_test.go @@ -7,6 +7,7 @@ import ( runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime" + "github.com/rilldata/rill/runtime/pkg/expressionpb" "github.com/rilldata/rill/runtime/queries" "github.com/rilldata/rill/runtime/testruntime" "github.com/stretchr/testify/require" @@ -300,14 +301,10 @@ func TestMetricsViewTimeSeries_DayLightSavingsBackwards_Sparse_Daily(t *testing. q := &queries.MetricsViewTimeSeries{ MeasureNames: []string{"total_records"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "label", - In: []*structpb.Value{toStructpbValue(t, "sparse_day")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("label"), + []*runtimev1.Expression{expressionpb.Value(toStructpbValue(t, "sparse_day"))}, + ), MetricsViewName: "timeseries_dst_backwards", MetricsView: mv.Spec, TimeStart: parseTime(t, "2023-11-03T04:00:00.000Z"), @@ -474,14 +471,10 @@ func TestMetricsViewTimeSeries_DayLightSavingsBackwards_Sparse_Hourly(t *testing q := &queries.MetricsViewTimeSeries{ MeasureNames: []string{"total_records"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "label", - In: []*structpb.Value{toStructpbValue(t, "sparse_hour")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("label"), + []*runtimev1.Expression{expressionpb.Value(toStructpbValue(t, "sparse_hour"))}, + ), MetricsViewName: "timeseries_dst_backwards", MetricsView: mv.Spec, TimeStart: parseTime(t, "2023-11-05T03:00:00.000Z"), @@ -591,14 +584,10 @@ func TestMetricsViewTimeSeries_DayLightSavingsForwards_Sparse_Daily(t *testing.T q := &queries.MetricsViewTimeSeries{ MeasureNames: []string{"total_records"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "label", - In: []*structpb.Value{toStructpbValue(t, "sparse_day")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("label"), + []*runtimev1.Expression{expressionpb.Value(toStructpbValue(t, "sparse_day"))}, + ), MetricsViewName: "timeseries_dst_forwards", MetricsView: mv.Spec, TimeStart: parseTime(t, "2023-03-10T05:00:00.000Z"), @@ -673,14 +662,10 @@ func TestMetricsViewTimeSeries_DayLightSavingsForwards_Sparse_Hourly(t *testing. q := &queries.MetricsViewTimeSeries{ MeasureNames: []string{"total_records"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "label", - In: []*structpb.Value{toStructpbValue(t, "sparse_hour")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("label"), + []*runtimev1.Expression{expressionpb.Value(toStructpbValue(t, "sparse_hour"))}, + ), MetricsViewName: "timeseries_dst_forwards", MetricsView: mv.Spec, TimeStart: parseTime(t, "2023-03-12T04:00:00.000Z"), @@ -711,6 +696,68 @@ func TestMetricsViewTimeSeries_DayLightSavingsForwards_Sparse_Hourly(t *testing. require.Nil(t, q.Result.Data[i].Records.AsMap()["total_records"]) } +func TestMetricsViewTimeSeries_having_clause(t *testing.T) { + rt, instanceID := testruntime.NewInstanceForProject(t, "timeseries") + + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(t, err) + r, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "timeseries_gaps"}, false) + require.NoError(t, err) + mv := r.GetMetricsView() + + q := &queries.MetricsViewTimeSeries{ + MeasureNames: []string{"sum_imps"}, + MetricsViewName: "timeseries_gaps", + MetricsView: mv.Spec, + TimeStart: parseTime(t, "2019-01-01T00:00:00Z"), + TimeEnd: parseTime(t, "2019-01-07T00:00:00Z"), + TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_DAY, + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_LTE, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "sum_imps", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(3), + }, + }, + }, + }, + }, + }, + Limit: 250, + } + err = q.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + require.NotEmpty(t, q.Result) + rows := q.Result.Data + require.Len(t, rows, 6) + i := 0 + require.Equal(t, parseTime(t, "2019-01-01T00:00:00Z").AsTime(), rows[i].Ts.AsTime()) + require.NotNil(t, q.Result.Data[i].Records.AsMap()["sum_imps"]) + i++ + require.Equal(t, parseTime(t, "2019-01-02T00:00:00Z").AsTime(), rows[i].Ts.AsTime()) + require.Nil(t, q.Result.Data[i].Records.AsMap()["sum_imps"]) + i++ + require.Equal(t, parseTime(t, "2019-01-03T00:00:00Z").AsTime(), rows[i].Ts.AsTime()) + require.Nil(t, q.Result.Data[i].Records.AsMap()["sum_imps"]) + i++ + require.Equal(t, parseTime(t, "2019-01-04T00:00:00Z").AsTime(), rows[i].Ts.AsTime()) + require.Nil(t, q.Result.Data[i].Records.AsMap()["sum_imps"]) + i++ + require.Equal(t, parseTime(t, "2019-01-05T00:00:00Z").AsTime(), rows[i].Ts.AsTime()) + require.Nil(t, q.Result.Data[i].Records.AsMap()["sum_imps"]) + i++ + require.Equal(t, parseTime(t, "2019-01-06T00:00:00Z").AsTime(), rows[i].Ts.AsTime()) + require.NotNil(t, q.Result.Data[i].Records.AsMap()["sum_imps"]) +} + func toStructpbValue(t *testing.T, v any) *structpb.Value { sv, err := structpb.NewValue(v) require.NoError(t, err) diff --git a/runtime/queries/metricsview_toplist.go b/runtime/queries/metricsview_toplist.go index cbac2e637a3..c059cc4aebb 100644 --- a/runtime/queries/metricsview_toplist.go +++ b/runtime/queries/metricsview_toplist.go @@ -23,10 +23,14 @@ type MetricsViewToplist struct { Limit *int64 `json:"limit,omitempty"` Offset int64 `json:"offset,omitempty"` Sort []*runtimev1.MetricsViewSort `json:"sort,omitempty"` - Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Where *runtimev1.Expression `json:"where,omitempty"` + Having *runtimev1.Expression `json:"having,omitempty"` MetricsView *runtimev1.MetricsViewSpec `json:"-"` ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` + // backwards compatibility + Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Result *runtimev1.MetricsViewToplistResponse `json:"-"` } @@ -77,6 +81,14 @@ func (q *MetricsViewToplist) Resolve(ctx context.Context, rt *runtime.Runtime, i return fmt.Errorf("metrics view '%s' does not have a time dimension", q.MetricsViewName) } + // backwards compatibility + if q.Filter != nil { + if q.Where != nil { + return fmt.Errorf("both filter and where is provided") + } + q.Where = convertFilterToExpression(q.Filter) + } + // Build query sql, args, err := q.buildMetricsTopListSQL(q.MetricsView, olap.Dialect(), q.ResolvedMVSecurity) if err != nil { @@ -166,7 +178,7 @@ func (q *MetricsViewToplist) generalExport(ctx context.Context, rt *runtime.Runt func (q *MetricsViewToplist) generateFilename(mv *runtimev1.MetricsViewSpec) string { filename := strings.ReplaceAll(q.MetricsViewName, `"`, `_`) filename += "_" + q.DimensionName - if q.TimeStart != nil || q.TimeEnd != nil || q.Filter != nil && (len(q.Filter.Include) > 0 || len(q.Filter.Exclude) > 0) { + if q.TimeStart != nil || q.TimeEnd != nil || q.Where != nil || q.Having != nil { filename += "_filtered" } return filename @@ -214,15 +226,26 @@ func (q *MetricsViewToplist) buildMetricsTopListSQL(mv *runtimev1.MetricsViewSpe } } - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, dialect) if err != nil { return "", nil, err } - whereClause += " " + clause + whereClause += " AND " + clause args = append(args, clauseArgs...) } + havingClause := "" + if q.Having != nil { + var havingClauseArgs []any + havingClause, havingClauseArgs, err = buildExpression(mv, q.Having, nil, dialect) + if err != nil { + return "", nil, err + } + havingClause = "HAVING " + havingClause + args = append(args, havingClauseArgs...) + } + sortingCriteria := make([]string, 0, len(q.Sort)) for _, s := range q.Sort { sortCriterion := safeName(s.Name) @@ -249,12 +272,13 @@ func (q *MetricsViewToplist) buildMetricsTopListSQL(mv *runtimev1.MetricsViewSpe groupByCol = unnestColName } - sql := fmt.Sprintf("SELECT %s FROM %s %s WHERE %s GROUP BY %s %s %s OFFSET %d", + sql := fmt.Sprintf("SELECT %s FROM %s %s WHERE %s GROUP BY %s %s %s %s OFFSET %d", strings.Join(selectCols, ", "), safeName(mv.Table), unnestClause, whereClause, groupByCol, + havingClause, orderClause, limitClause, q.Offset, diff --git a/runtime/queries/metricsview_toplist_test.go b/runtime/queries/metricsview_toplist_test.go new file mode 100644 index 00000000000..9bcb7e5b868 --- /dev/null +++ b/runtime/queries/metricsview_toplist_test.go @@ -0,0 +1,77 @@ +package queries_test + +import ( + "context" + "testing" + + runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/rilldata/rill/runtime" + "github.com/rilldata/rill/runtime/queries" + "github.com/rilldata/rill/runtime/testruntime" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestMetricsViewsToplist_measure_filters(t *testing.T) { + rt, instanceID := testruntime.NewInstanceForProject(t, "ad_bids") + + ctr := &queries.ColumnTimeRange{ + TableName: "ad_bids", + ColumnName: "timestamp", + } + err := ctr.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + diff := ctr.Result.Max.AsTime().Sub(ctr.Result.Min.AsTime()) + maxTime := ctr.Result.Min.AsTime().Add(diff / 2) + + ctrl, err := rt.Controller(context.Background(), instanceID) + require.NoError(t, err) + r, err := ctrl.Get(context.Background(), &runtimev1.ResourceName{Kind: runtime.ResourceKindMetricsView, Name: "ad_bids_metrics"}, false) + require.NoError(t, err) + mv := r.GetMetricsView() + + lmt := int64(250) + q := &queries.MetricsViewToplist{ + MetricsViewName: "ad_bids_metrics", + DimensionName: "dom", + MeasureNames: []string{"measure_1"}, + MetricsView: mv.Spec, + TimeStart: ctr.Result.Min, + TimeEnd: timestamppb.New(maxTime), + Having: &runtimev1.Expression{ + Expression: &runtimev1.Expression_Cond{ + Cond: &runtimev1.Condition{ + Op: runtimev1.Operation_OPERATION_GT, + Exprs: []*runtimev1.Expression{ + { + Expression: &runtimev1.Expression_Ident{ + Ident: "measure_1", + }, + }, + { + Expression: &runtimev1.Expression_Val{ + Val: structpb.NewNumberValue(3.25), + }, + }, + }, + }, + }, + }, + Sort: []*runtimev1.MetricsViewSort{ + { + Name: "domain", + Ascending: false, + }, + }, + Limit: &lmt, + } + + err = q.Resolve(context.Background(), rt, instanceID, 0) + require.NoError(t, err) + require.NotEmpty(t, q.Result) + require.Len(t, q.Result.Data, 3) + require.Equal(t, "sports.yahoo.com", q.Result.Data[0].AsMap()["domain"]) + require.Equal(t, "news.google.com", q.Result.Data[1].AsMap()["domain"]) + require.Equal(t, "instagram.com", q.Result.Data[2].AsMap()["domain"]) +} diff --git a/runtime/queries/metricsview_totals.go b/runtime/queries/metricsview_totals.go index f3279536ae9..2f7003949f2 100644 --- a/runtime/queries/metricsview_totals.go +++ b/runtime/queries/metricsview_totals.go @@ -19,10 +19,14 @@ type MetricsViewTotals struct { InlineMeasures []*runtimev1.InlineMeasure `json:"inline_measures,omitempty"` TimeStart *timestamppb.Timestamp `json:"time_start,omitempty"` TimeEnd *timestamppb.Timestamp `json:"time_end,omitempty"` - Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Where *runtimev1.Expression `json:"where,omitempty"` + Having *runtimev1.Expression `json:"having,omitempty"` MetricsView *runtimev1.MetricsViewSpec `json:"-"` ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` + // backwards compatibility + Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Result *runtimev1.MetricsViewTotalsResponse `json:"-"` } @@ -73,6 +77,14 @@ func (q *MetricsViewTotals) Resolve(ctx context.Context, rt *runtime.Runtime, in return fmt.Errorf("metrics view '%s' does not have a time dimension", q.MetricsViewName) } + // backwards compatibility + if q.Filter != nil { + if q.Where != nil { + return fmt.Errorf("both filter and where is provided") + } + q.Where = convertFilterToExpression(q.Filter) + } + ql, args, err := q.buildMetricsTotalsSQL(q.MetricsView, olap.Dialect(), q.ResolvedMVSecurity) if err != nil { return fmt.Errorf("error building query: %w", err) @@ -124,12 +136,12 @@ func (q *MetricsViewTotals) buildMetricsTotalsSQL(mv *runtimev1.MetricsViewSpec, } } - if q.Filter != nil { - clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if q.Where != nil { + clause, clauseArgs, err := buildExpression(mv, q.Where, nil, dialect) if err != nil { return "", nil, err } - whereClause += " " + clause + whereClause += " AND " + clause args = append(args, clauseArgs...) } diff --git a/runtime/server/batch_query_test.go b/runtime/server/batch_query_test.go index 933e8780892..e9a9d358fe1 100644 --- a/runtime/server/batch_query_test.go +++ b/runtime/server/batch_query_test.go @@ -55,9 +55,9 @@ func TestServer_QueryBatch_MetricsViewQueries(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: false, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: false, }, }, }, diff --git a/runtime/server/downloads.go b/runtime/server/downloads.go index d92d4aaa7e2..476cf3dc9e6 100644 --- a/runtime/server/downloads.go +++ b/runtime/server/downloads.go @@ -152,7 +152,8 @@ func (s *Server) downloadHandler(w http.ResponseWriter, req *http.Request) { Measures: r.Measures, Sort: r.Sort, TimeRange: tr, - Filter: r.Filter, + Where: r.Where, + Having: r.Having, Limit: limitPtr, Offset: r.Offset, MetricsView: mv, @@ -203,7 +204,8 @@ func (s *Server) downloadHandler(w http.ResponseWriter, req *http.Request) { TimeStart: r.TimeStart, TimeEnd: r.TimeEnd, Sort: r.Sort, - Filter: r.Filter, + Where: r.Where, + Having: r.Having, Limit: limitPtr, MetricsView: mv, ResolvedMVSecurity: security, @@ -230,7 +232,7 @@ func (s *Server) downloadHandler(w http.ResponseWriter, req *http.Request) { MetricsViewName: r.MetricsViewName, TimeStart: r.TimeStart, TimeEnd: r.TimeEnd, - Filter: r.Filter, + Where: r.Where, Sort: r.Sort, Limit: limitPtr, TimeZone: r.TimeZone, @@ -263,7 +265,8 @@ func (s *Server) downloadHandler(w http.ResponseWriter, req *http.Request) { TimeStart: r.TimeStart, TimeEnd: r.TimeEnd, TimeGranularity: r.TimeGranularity, - Filter: r.Filter, + Where: r.Where, + Having: r.Having, TimeZone: r.TimeZone, MetricsView: mv, ResolvedMVSecurity: security, @@ -303,7 +306,8 @@ func (s *Server) downloadHandler(w http.ResponseWriter, req *http.Request) { Limit: s.resolveExportLimit(request.Limit, r.Limit), Offset: r.Offset, Sort: r.Sort, - Filter: r.Filter, + Where: r.Where, + Having: r.Having, MetricsView: mv, ResolvedMVSecurity: security, } diff --git a/runtime/server/observability_utils.go b/runtime/server/observability_utils.go index 96477c3ef0e..af225b9e5eb 100644 --- a/runtime/server/observability_utils.go +++ b/runtime/server/observability_utils.go @@ -12,11 +12,20 @@ func safeTimeStr(t *timestamppb.Timestamp) string { return t.AsTime().String() } -func filterCount(m *runtimev1.MetricsViewFilter) int { +func filterCount(m *runtimev1.Expression) int { if m == nil { return 0 } - return len(m.Include) + len(m.Exclude) + c := 0 + switch e := m.Expression.(type) { + case *runtimev1.Expression_Ident: + c++ + case *runtimev1.Expression_Cond: + for _, expr := range e.Cond.Exprs { + c += filterCount(expr) + } + } + return c } func marshalInlineMeasure(ms []*runtimev1.InlineMeasure) []string { diff --git a/runtime/server/queries_metrics.go b/runtime/server/queries_metrics.go index ac7b3f319d7..c9a920b413f 100644 --- a/runtime/server/queries_metrics.go +++ b/runtime/server/queries_metrics.go @@ -26,7 +26,7 @@ func (s *Server) MetricsViewAggregation(ctx context.Context, req *runtimev1.Metr attribute.StringSlice("args.sort.names", marshalMetricsViewAggregationSort(req.Sort)), attribute.String("args.time_start", safeTimeStr(req.TimeStart)), attribute.String("args.time_end", safeTimeStr(req.TimeEnd)), - attribute.Int("args.filter_count", filterCount(req.Filter)), + attribute.Int("args.filter_count", filterCount(req.Where)), attribute.Int64("args.limit", req.Limit), attribute.Int64("args.offset", req.Offset), attribute.Int("args.priority", int(req.Priority)), @@ -75,11 +75,13 @@ func (s *Server) MetricsViewAggregation(ctx context.Context, req *runtimev1.Metr Measures: req.Measures, Sort: req.Sort, TimeRange: tr, - Filter: req.Filter, + Where: req.Where, + Having: req.Having, Limit: &req.Limit, Offset: req.Offset, MetricsView: mv, ResolvedMVSecurity: security, + Filter: req.Filter, } err = s.runtime.Query(ctx, req.InstanceId, q, int(req.Priority)) if err != nil { @@ -101,9 +103,9 @@ func (s *Server) MetricsViewToplist(ctx context.Context, req *runtimev1.MetricsV attribute.Int("args.priority", int(req.Priority)), attribute.String("args.time_start", safeTimeStr(req.TimeStart)), attribute.String("args.time_end", safeTimeStr(req.TimeEnd)), + attribute.Int("args.filter_count", filterCount(req.Where)), attribute.StringSlice("args.sort.names", marshalMetricsViewSort(req.Sort)), attribute.StringSlice("args.inline_measures", marshalInlineMeasure(req.InlineMeasures)), - attribute.Int("args.filter_count", filterCount(req.Filter)), ) s.addInstanceRequestAttributes(ctx, req.InstanceId) @@ -147,9 +149,11 @@ func (s *Server) MetricsViewToplist(ctx context.Context, req *runtimev1.MetricsV Limit: &req.Limit, Offset: req.Offset, Sort: req.Sort, - Filter: req.Filter, + Where: req.Where, + Having: req.Having, MetricsView: mv, ResolvedMVSecurity: security, + Filter: req.Filter, } err = s.runtime.Query(ctx, req.InstanceId, q, int(req.Priority)) if err != nil { @@ -171,7 +175,7 @@ func (s *Server) MetricsViewComparison(ctx context.Context, req *runtimev1.Metri attribute.String("args.dimension", req.Dimension.Name), attribute.StringSlice("args.measures", measureNames), attribute.StringSlice("args.sort.names", marshalMetricsViewComparisonSort(req.Sort)), - attribute.Int("args.filter_count", filterCount(req.Filter)), + attribute.Int("args.filter_count", filterCount(req.Where)), attribute.Int64("args.limit", req.Limit), attribute.Int64("args.offset", req.Offset), attribute.Int("args.priority", int(req.Priority)), @@ -221,10 +225,12 @@ func (s *Server) MetricsViewComparison(ctx context.Context, req *runtimev1.Metri Limit: req.Limit, Offset: req.Offset, Sort: req.Sort, - Filter: req.Filter, + Where: req.Where, + Having: req.Having, MetricsView: mv, ResolvedMVSecurity: security, Exact: req.Exact, + Filter: req.Filter, } err = s.runtime.Query(ctx, req.InstanceId, q, int(req.Priority)) if err != nil { @@ -244,7 +250,7 @@ func (s *Server) MetricsViewTimeSeries(ctx context.Context, req *runtimev1.Metri attribute.String("args.time_start", safeTimeStr(req.TimeStart)), attribute.String("args.time_end", safeTimeStr(req.TimeEnd)), attribute.String("args.time_granularity", req.TimeGranularity.String()), - attribute.Int("args.filter_count", filterCount(req.Filter)), + attribute.Int("args.filter_count", filterCount(req.Where)), attribute.Int("args.priority", int(req.Priority)), ) @@ -278,10 +284,12 @@ func (s *Server) MetricsViewTimeSeries(ctx context.Context, req *runtimev1.Metri TimeStart: req.TimeStart, TimeEnd: req.TimeEnd, TimeGranularity: req.TimeGranularity, - Filter: req.Filter, + Where: req.Where, + Having: req.Having, TimeZone: req.TimeZone, MetricsView: mv, ResolvedMVSecurity: security, + Filter: req.Filter, } err = s.runtime.Query(ctx, req.InstanceId, q, int(req.Priority)) if err != nil { @@ -299,7 +307,7 @@ func (s *Server) MetricsViewTotals(ctx context.Context, req *runtimev1.MetricsVi attribute.StringSlice("args.inline_measures.names", marshalInlineMeasure(req.InlineMeasures)), attribute.String("args.time_start", safeTimeStr(req.TimeStart)), attribute.String("args.time_end", safeTimeStr(req.TimeEnd)), - attribute.Int("args.filter_count", filterCount(req.Filter)), + attribute.Int("args.filter_count", filterCount(req.Where)), attribute.Int("args.priority", int(req.Priority)), ) @@ -332,9 +340,10 @@ func (s *Server) MetricsViewTotals(ctx context.Context, req *runtimev1.MetricsVi InlineMeasures: req.InlineMeasures, TimeStart: req.TimeStart, TimeEnd: req.TimeEnd, - Filter: req.Filter, + Where: req.Where, MetricsView: mv, ResolvedMVSecurity: security, + Filter: req.Filter, } err = s.runtime.Query(ctx, req.InstanceId, q, int(req.Priority)) if err != nil { @@ -351,7 +360,7 @@ func (s *Server) MetricsViewRows(ctx context.Context, req *runtimev1.MetricsView attribute.String("args.time_start", safeTimeStr(req.TimeStart)), attribute.String("args.time_end", safeTimeStr(req.TimeEnd)), attribute.String("args.time_granularity", req.TimeGranularity.String()), - attribute.Int("args.filter_count", filterCount(req.Filter)), + attribute.Int("args.filter_count", filterCount(req.Where)), attribute.StringSlice("args.sort.names", marshalMetricsViewSort(req.Sort)), attribute.Int("args.limit", int(req.Limit)), attribute.Int64("args.offset", req.Offset), @@ -376,13 +385,14 @@ func (s *Server) MetricsViewRows(ctx context.Context, req *runtimev1.MetricsView TimeStart: req.TimeStart, TimeEnd: req.TimeEnd, TimeGranularity: req.TimeGranularity, - Filter: req.Filter, + Where: req.Where, Sort: req.Sort, Limit: &limit, Offset: req.Offset, TimeZone: req.TimeZone, MetricsView: mv, ResolvedMVSecurity: security, + Filter: req.Filter, } err = s.runtime.Query(ctx, req.InstanceId, q, int(req.Priority)) if err != nil { diff --git a/runtime/server/queries_metrics_aggregation_test.go b/runtime/server/queries_metrics_aggregation_test.go index e78a141537a..faffd3e7635 100644 --- a/runtime/server/queries_metrics_aggregation_test.go +++ b/runtime/server/queries_metrics_aggregation_test.go @@ -37,7 +37,7 @@ func TestMetricsViewAggregation_Toplist(t *testing.T) { require.Equal(t, "yahoo.com", tr.Data[1].Fields["domain"].GetStringValue()) require.Equal(t, 1.0, tr.Data[1].Fields["measure_2"].GetNumberValue()) - require.Equal(t, 1.0, tr.Data[0].Fields["__count"].GetNumberValue()) + require.Equal(t, 1.0, tr.Data[1].Fields["__count"].GetNumberValue()) } func TestMetricsViewAggregation_Totals(t *testing.T) { diff --git a/runtime/server/queries_metrics_comparison_toplist_test.go b/runtime/server/queries_metrics_comparison_toplist_test.go index 19410ff8e65..ebb8d117ce6 100644 --- a/runtime/server/queries_metrics_comparison_toplist_test.go +++ b/runtime/server/queries_metrics_comparison_toplist_test.go @@ -6,6 +6,7 @@ import ( runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/pkg/activity" + "github.com/rilldata/rill/runtime/pkg/expressionpb" "github.com/rilldata/rill/runtime/pkg/ratelimit" "github.com/rilldata/rill/runtime/server" "github.com/rilldata/rill/runtime/testruntime" @@ -81,16 +82,16 @@ func TestServer_MetricsViewComparison(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: false, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: false, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 1, len(rows)) require.Equal(t, "cars", rows[0].DimensionValue.GetStringValue()) @@ -137,16 +138,16 @@ func TestServer_MetricsViewComparison_inline_measures(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: false, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: false, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 1, len(rows)) require.Equal(t, "cars", rows[0].DimensionValue.GetStringValue()) @@ -188,16 +189,16 @@ func TestServer_MetricsViewComparison_nulls(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: false, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: false, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 2, len(rows)) require.Equal(t, "yahoo.com", rows[0].DimensionValue.GetStringValue()) @@ -255,16 +256,16 @@ func TestServer_MetricsViewComparison_sort_by_base(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: true, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: true, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 2, len(rows)) require.Equal(t, "yahoo.com", rows[0].DimensionValue.GetStringValue()) @@ -313,16 +314,16 @@ func TestServer_MetricsViewComparison_sort_by_comparison(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_COMPARISON_VALUE, - Desc: true, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE, + Desc: true, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 2, len(rows)) require.Equal(t, "msn.com", rows[0].DimensionValue.GetStringValue()) @@ -372,16 +373,16 @@ func TestServer_MetricsViewComparison_sort_by_abs_delta(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 2, len(rows)) require.Equal(t, "yahoo.com", rows[0].DimensionValue.GetStringValue()) @@ -430,16 +431,16 @@ func TestServer_MetricsViewComparison_sort_by_rel_delta(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA, - Desc: true, + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA, + Desc: true, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 2, len(rows)) require.Equal(t, "msn.com", rows[0].DimensionValue.GetStringValue()) @@ -480,9 +481,9 @@ func TestServer_MetricsViewComparison_sort_error(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_1", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "measure_1", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Exact: true, @@ -523,17 +524,17 @@ func TestServer_MetricsViewComparison_sort_by_delta_limit_1(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Limit: 1, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 1, len(rows)) require.Equal(t, "yahoo.com", rows[0].DimensionValue.GetStringValue()) @@ -568,17 +569,17 @@ func TestServer_MetricsViewComparison_sort_by_base_limit_1(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: true, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: true, }, }, Limit: 1, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 1, len(rows)) require.Equal(t, "yahoo.com", rows[0].DimensionValue.GetStringValue()) @@ -613,24 +614,20 @@ func TestServer_MetricsViewComparison_sort_by_base_filter(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - Desc: true, - }, - }, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{structpb.NewStringValue("yahoo.com")}, - }, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + Desc: true, }, }, + Where: expressionpb.NotIn( + expressionpb.Identifier("domain"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("yahoo.com"))}, + ), Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 1, len(rows)) require.Equal(t, "msn.com", rows[0].DimensionValue.GetStringValue()) @@ -685,16 +682,16 @@ func TestServer_MetricsViewComparison_2_measures(t *testing.T) { }, Sort: []*runtimev1.MetricsViewComparisonSort{ { - Name: "measure_2", - Type: runtimev1.MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, - Desc: true, + Name: "measure_2", + SortType: runtimev1.MetricsViewComparisonMeasureType_METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, + Desc: true, }, }, Exact: true, }) - rows := tr.Rows require.NoError(t, err) + rows := tr.Rows require.Equal(t, 2, len(rows)) require.Equal(t, "yahoo.com", rows[0].DimensionValue.GetStringValue()) @@ -1075,16 +1072,10 @@ func TestServer_MetricsViewComparison_no_comparison_complete_source_sanity_test( Desc: false, }, }, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "pub", - In: []*structpb.Value{ - structpb.NewStringValue("Yahoo"), - }, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("pub"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("Yahoo"))}, + ), Exact: true, }) require.NoError(t, err) diff --git a/runtime/server/queries_metrics_timeseries_test.go b/runtime/server/queries_metrics_timeseries_test.go index 26e4c273b77..94d3c4536e4 100644 --- a/runtime/server/queries_metrics_timeseries_test.go +++ b/runtime/server/queries_metrics_timeseries_test.go @@ -8,6 +8,7 @@ import ( runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime" + "github.com/rilldata/rill/runtime/pkg/expressionpb" "github.com/rilldata/rill/runtime/queries" "github.com/rilldata/rill/runtime/server/auth" "github.com/rilldata/rill/runtime/testruntime" @@ -70,17 +71,10 @@ func TestServer_MetricsViewTimeSeries_complete_source_sanity_test(t *testing.T) MetricsViewName: "ad_bids_metrics", TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_DAY, MeasureNames: []string{"measure_0", "measure_1"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "dom", - In: []*structpb.Value{ - structpb.NewStringValue("msn.com"), - }, - Like: []string{"%yahoo%"}, - }, - }, - }, + Where: expressionpb.Or([]*runtimev1.Expression{ + expressionpb.In(expressionpb.Identifier("dom"), []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("msn.com"))}), + expressionpb.Like(expressionpb.Identifier("dom"), expressionpb.Value(structpb.NewStringValue("%yahoo%"))), + }), }) require.NoError(t, err) require.True(t, len(tr.Data) > 0) @@ -101,14 +95,10 @@ func TestServer_Timeseries(t *testing.T) { TimeStart: parseTimeToProtoTimeStamps(t, "2019-01-01T00:00:00Z"), TimeEnd: parseTimeToProtoTimeStamps(t, "2019-12-02T00:00:00Z"), TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{structpb.NewStringValue("android"), structpb.NewStringValue("iphone")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("android")), expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) @@ -126,14 +116,10 @@ func Ignore_TestServer_Timeseries_exclude_notnull(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"count"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "latitude", - In: []*structpb.Value{structpb.NewNumberValue(25)}, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("latitude"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNumberValue(25))}, + ), }) require.NoError(t, err) @@ -151,14 +137,10 @@ func Ignore_TestServer_Timeseries_exclude_all(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"count"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "latitude", - In: []*structpb.Value{structpb.NewNumberValue(25), structpb.NewNullValue()}, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("latitude"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNumberValue(25)), expressionpb.Value(structpb.NewNullValue())}, + ), }) require.NoError(t, err) @@ -176,14 +158,10 @@ func TestServer_Timeseries_exclude_notnull_string(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"count"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "country", - In: []*structpb.Value{structpb.NewStringValue("Canada")}, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("country"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("Canada"))}, + ), }) require.NoError(t, err) @@ -201,14 +179,10 @@ func TestServer_Timeseries_exclude_all_string(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"sum_imps"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "country", - In: []*structpb.Value{structpb.NewStringValue("Canada"), structpb.NewNullValue()}, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("country"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("Canada")), expressionpb.Value(structpb.NewNullValue())}, + ), }) require.NoError(t, err) @@ -225,14 +199,10 @@ func TestServer_Timeseries_exclude_notnull_like(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"count"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - Like: []string{"iphone"}, - }, - }, - }, + Where: expressionpb.NotLike( + expressionpb.Identifier("device"), + expressionpb.Value(structpb.NewStringValue("iphone")), + ), }) require.NoError(t, err) @@ -250,15 +220,16 @@ func TestServer_Timeseries_exclude_like_all(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"sum_imps"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "country", - In: []*structpb.Value{structpb.NewNullValue()}, - Like: []string{"Canada"}, - }, - }, - }, + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.NotIn( + expressionpb.Identifier("country"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue())}, + ), + expressionpb.NotLike( + expressionpb.Identifier("country"), + expressionpb.Value(structpb.NewStringValue("Canada")), + ), + }), }) require.NoError(t, err) @@ -275,14 +246,10 @@ func TestServer_Timeseries_numeric_dim(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"count"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "latitude", - In: []*structpb.Value{structpb.NewNumberValue(25)}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("latitude"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNumberValue(25))}, + ), }) require.NoError(t, err) @@ -300,14 +267,10 @@ func TestServer_Timeseries_numeric_dim_2values(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"count"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "latitude", - In: []*structpb.Value{structpb.NewNumberValue(25), structpb.NewNumberValue(35)}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("latitude"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNumberValue(25)), expressionpb.Value(structpb.NewNumberValue(35))}, + ), }) require.NoError(t, err) @@ -325,14 +288,10 @@ func TestServer_Timeseries_numeric_dim_and_null(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"count"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "latitude", - In: []*structpb.Value{structpb.NewNumberValue(25), structpb.NewNullValue()}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("latitude"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNumberValue(25)), expressionpb.Value(structpb.NewNullValue())}, + ), }) require.NoError(t, err) @@ -531,14 +490,10 @@ func TestServer_Timeseries_2measures(t *testing.T) { TimeStart: parseTimeToProtoTimeStamps(t, "2019-01-01T00:00:00Z"), TimeEnd: parseTimeToProtoTimeStamps(t, "2019-12-01T00:00:00Z"), TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{structpb.NewStringValue("android"), structpb.NewStringValue("iphone")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("android")), expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) @@ -559,14 +514,10 @@ func TestServer_Timeseries_1dim(t *testing.T) { TimeStart: parseTimeToProtoTimeStamps(t, "2019-01-01T00:00:00Z"), TimeEnd: parseTimeToProtoTimeStamps(t, "2019-12-01T00:00:00Z"), TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{structpb.NewStringValue("android")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("android"))}, + ), }) require.NoError(t, err) @@ -584,14 +535,10 @@ func TestServer_Timeseries_1dim_null(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"sum_clicks"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "publisher", - In: []*structpb.Value{structpb.NewNullValue()}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("publisher"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue())}, + ), }) require.NoError(t, err) @@ -609,17 +556,10 @@ func TestServer_Timeseries_1dim_null_and_in(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"sum_clicks"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "publisher", - In: []*structpb.Value{ - structpb.NewNullValue(), - structpb.NewStringValue("Google"), - }, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("publisher"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue()), expressionpb.Value(structpb.NewStringValue("Google"))}, + ), }) require.NoError(t, err) @@ -637,20 +577,16 @@ func TestServer_Timeseries_1dim_null_and_in_and_like(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"sum_clicks"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "publisher", - In: []*structpb.Value{ - structpb.NewNullValue(), - structpb.NewStringValue("Google"), - }, - Like: []string{ - "Goo%", - }, - }, - }, - }, + Where: expressionpb.Or([]*runtimev1.Expression{ + expressionpb.In( + expressionpb.Identifier("publisher"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue()), expressionpb.Value(structpb.NewStringValue("Google"))}, + ), + expressionpb.Like( + expressionpb.Identifier("publisher"), + expressionpb.Value(structpb.NewStringValue("Goo%")), + ), + }), }) require.NoError(t, err) @@ -668,17 +604,16 @@ func TestServer_Timeseries_1dim_2like(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"sum_clicks"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - Like: []string{ - "g%", - "msn%", - }, - }, - }, - }, + Where: expressionpb.Or([]*runtimev1.Expression{ + expressionpb.Like( + expressionpb.Identifier("domain"), + expressionpb.Value(structpb.NewStringValue("g%")), + ), + expressionpb.Like( + expressionpb.Identifier("domain"), + expressionpb.Value(structpb.NewStringValue("msn%")), + ), + }), }) require.NoError(t, err) @@ -696,22 +631,16 @@ func TestServer_Timeseries_2dim_include_and_exclude(t *testing.T) { MetricsViewName: "timeseries", MeasureNames: []string{"sum_clicks"}, TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_YEAR, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "publisher", - In: []*structpb.Value{ - structpb.NewStringValue("Google"), - }, - }, - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("msn.com"), - }, - }, - }, - }, + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.In( + expressionpb.Identifier("publisher"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("Google"))}, + ), + expressionpb.In( + expressionpb.Identifier("domain"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("msn.com"))}, + ), + }), }) require.NoError(t, err) @@ -730,14 +659,10 @@ func TestServer_Timeseries_1day(t *testing.T) { TimeStart: parseTimeToProtoTimeStamps(t, "2019-01-01T00:00:00Z"), TimeEnd: parseTimeToProtoTimeStamps(t, "2019-01-03T00:00:00Z"), TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_DAY, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{structpb.NewStringValue("android"), structpb.NewStringValue("iphone")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("android")), expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) @@ -805,14 +730,10 @@ func TestServer_Timeseries_1day_Count(t *testing.T) { TimeStart: parseTimeToProtoTimeStamps(t, "2019-01-01T00:00:00Z"), TimeEnd: parseTimeToProtoTimeStamps(t, "2019-01-03T00:00:00Z"), TimeGranularity: runtimev1.TimeGrain_TIME_GRAIN_DAY, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{structpb.NewStringValue("android"), structpb.NewStringValue("iphone")}, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("android")), expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) diff --git a/runtime/server/queries_metrics_toplist_test.go b/runtime/server/queries_metrics_toplist_test.go index 5e5fda1a052..faf699bb70c 100644 --- a/runtime/server/queries_metrics_toplist_test.go +++ b/runtime/server/queries_metrics_toplist_test.go @@ -4,6 +4,7 @@ import ( "testing" runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/rilldata/rill/runtime/pkg/expressionpb" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -333,16 +334,10 @@ func TestServer_MetricsViewToplist_complete_source_sanity_test(t *testing.T) { Ascending: true, }, }, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "pub", - In: []*structpb.Value{ - structpb.NewStringValue("Yahoo"), - }, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("pub"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("Yahoo"))}, + ), }) require.NoError(t, err) require.True(t, len(tr.Data) > 1) @@ -364,16 +359,10 @@ func TestServer_MetricsViewToplist_DimensionsByName(t *testing.T) { Ascending: true, }, }, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "pub", - In: []*structpb.Value{ - structpb.NewStringValue("Yahoo"), - }, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("pub"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("Yahoo"))}, + ), }) require.NoError(t, err) require.True(t, len(tr.Data) > 1) diff --git a/runtime/server/queries_metrics_totals_test.go b/runtime/server/queries_metrics_totals_test.go index be57e2b5bf2..af72881333b 100644 --- a/runtime/server/queries_metrics_totals_test.go +++ b/runtime/server/queries_metrics_totals_test.go @@ -4,6 +4,7 @@ import ( "testing" runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/rilldata/rill/runtime/pkg/expressionpb" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -30,16 +31,10 @@ func TestServer_MetricsViewTotals_row_null_exclude(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{ - structpb.NewStringValue("iphone"), - }, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -54,16 +49,10 @@ func TestServer_MetricsViewTotals_row_null_exclude_null(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{ - structpb.NewNullValue(), - }, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue())}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -78,17 +67,10 @@ func TestServer_MetricsViewTotals_row_null_exclude_all(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{ - structpb.NewNullValue(), - structpb.NewStringValue("iphone"), - }, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue()), expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -103,16 +85,10 @@ func TestServer_MetricsViewTotals_row_null_include(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{ - structpb.NewStringValue("iphone"), - }, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -127,16 +103,10 @@ func TestServer_MetricsViewTotals_row_null_include_null(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{ - structpb.NewNullValue(), - }, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue())}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -151,17 +121,10 @@ func TestServer_MetricsViewTotals_row_null_include_all(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{ - structpb.NewNullValue(), - structpb.NewStringValue("iphone"), - }, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue()), expressionpb.Value(structpb.NewStringValue("iphone"))}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -176,14 +139,10 @@ func TestServer_MetricsViewTotals_row_null_exclude_like(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - Like: []string{"iphone"}, - }, - }, - }, + Where: expressionpb.NotLike( + expressionpb.Identifier("device"), + expressionpb.Value(structpb.NewStringValue("iphone")), + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -198,17 +157,16 @@ func TestServer_MetricsViewTotals_row_null_exclude_like_and_null(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - In: []*structpb.Value{ - structpb.NewNullValue(), - }, - Like: []string{"iphone"}, - }, - }, - }, + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.NotIn( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue())}, + ), + expressionpb.NotLike( + expressionpb.Identifier("device"), + expressionpb.Value(structpb.NewStringValue("iphone")), + ), + }), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -223,14 +181,10 @@ func TestServer_MetricsViewTotals_row_null_exclude_like_doesntexist(t *testing.T InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "device", - Like: []string{"doesntexist"}, - }, - }, - }, + Where: expressionpb.NotIn( + expressionpb.Identifier("device"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("doesntexist"))}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -335,16 +289,10 @@ func TestServer_MetricsViewTotals_1dim(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("msn.com"), - }, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("domain"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("msn.com"))}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -359,16 +307,14 @@ func TestServer_MetricsViewTotals_1dim_special_symbol_values(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("msn.'com"), structpb.NewStringValue("msn.\"com"), structpb.NewStringValue("msn. com"), - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("domain"), + []*runtimev1.Expression{ + expressionpb.Value(structpb.NewStringValue("msn.'com")), + expressionpb.Value(structpb.NewStringValue("msn.\"com")), + expressionpb.Value(structpb.NewStringValue("msn. com")), }, - }, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -383,17 +329,10 @@ func TestServer_MetricsViewTotals_1dim_2In(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("msn.com"), - structpb.NewStringValue("yahoo.com"), - }, - }, - }, - }, + Where: expressionpb.In( + expressionpb.Identifier("domain"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("msn.com")), expressionpb.Value(structpb.NewStringValue("yahoo.com"))}, + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -408,22 +347,16 @@ func TestServer_MetricsViewTotals_2dim(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("yahoo.com"), - }, - }, - { - Name: "publisher", - In: []*structpb.Value{ - structpb.NewStringValue("Yahoo"), - }, - }, - }, - }, + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.NotIn( + expressionpb.Identifier("domain"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("yahoo.com"))}, + ), + expressionpb.NotLike( + expressionpb.Identifier("publisher"), + expressionpb.Value(structpb.NewStringValue("Yahoo")), + ), + }), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -438,14 +371,10 @@ func TestServer_MetricsViewTotals_1dim_like(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - Like: []string{"%com"}, - }, - }, - }, + Where: expressionpb.Like( + expressionpb.Identifier("domain"), + expressionpb.Value(structpb.NewStringValue("%com")), + ), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -460,17 +389,10 @@ func TestServer_MetricsViewTotals_1dim_in_and_like(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("yahoo"), - }, - Like: []string{"%com"}, - }, - }, - }, + Where: expressionpb.Or([]*runtimev1.Expression{ + expressionpb.In(expressionpb.Identifier("domain"), []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("yahoo"))}), + expressionpb.Like(expressionpb.Identifier("domain"), expressionpb.Value(structpb.NewStringValue("%com"))), + }), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -485,14 +407,10 @@ func TestServer_MetricsViewTotals_1dim_2like(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - Like: []string{"msn%", "y%"}, - }, - }, - }, + Where: expressionpb.Or([]*runtimev1.Expression{ + expressionpb.Like(expressionpb.Identifier("domain"), expressionpb.Value(structpb.NewStringValue("msn%"))), + expressionpb.Like(expressionpb.Identifier("domain"), expressionpb.Value(structpb.NewStringValue("%com"))), + }), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -507,22 +425,10 @@ func TestServer_MetricsViewTotals_1dim_include_and_exclude(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - Like: []string{"%com"}, - }, - }, - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("yahoo.com"), - }, - }, - }, - }, + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.Like(expressionpb.Identifier("domain"), expressionpb.Value(structpb.NewStringValue("%com"))), + expressionpb.NotIn(expressionpb.Identifier("domain"), []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("yahoo.com"))}), + }), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -537,16 +443,9 @@ func TestServer_MetricsViewTotals_1dim_null(t *testing.T) { InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "publisher", - In: []*structpb.Value{ - structpb.NewNullValue(), - }, - }, - }, - }, + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.In(expressionpb.Identifier("publisher"), []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue())}), + }), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) @@ -561,26 +460,12 @@ func TestServer_MetricsViewTotals_1dim_include_and_exclude_in_and_like(t *testin InstanceId: instanceId, MetricsViewName: "ad_bids_metrics", MeasureNames: []string{"measure_0"}, - Filter: &runtimev1.MetricsViewFilter{ - Include: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "domain", - In: []*structpb.Value{ - structpb.NewStringValue("msn.com"), - }, - Like: []string{"%yahoo%"}, - }, - }, - Exclude: []*runtimev1.MetricsViewFilter_Cond{ - { - Name: "publisher", - In: []*structpb.Value{ - structpb.NewNullValue(), - }, - Like: []string{"Y%"}, - }, - }, - }, + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.In(expressionpb.Identifier("domain"), []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("msn.com"))}), + expressionpb.Like(expressionpb.Identifier("domain"), expressionpb.Value(structpb.NewStringValue("%yahoo%"))), + expressionpb.NotIn(expressionpb.Identifier("publisher"), []*runtimev1.Expression{expressionpb.Value(structpb.NewNullValue())}), + expressionpb.NotLike(expressionpb.Identifier("publisher"), expressionpb.Value(structpb.NewStringValue("Y%"))), + }), }) require.NoError(t, err) require.Equal(t, 1, len(tr.Data.Fields)) diff --git a/runtime/server/queries_test.go b/runtime/server/queries_test.go index edc41bb40b4..de10191460d 100644 --- a/runtime/server/queries_test.go +++ b/runtime/server/queries_test.go @@ -1,15 +1,13 @@ package server import ( + "context" "testing" "github.com/rilldata/rill/runtime/drivers" "github.com/rilldata/rill/runtime/pkg/activity" - "go.uber.org/zap" - - "context" - "github.com/stretchr/testify/require" + "go.uber.org/zap" ) func TestServer_InsertLimit_SELECT(t *testing.T) { diff --git a/runtime/testruntime/testdata/timeseries/models/timeseries_gap_model.sql b/runtime/testruntime/testdata/timeseries/models/timeseries_gap_model.sql index 5b2e486802e..dc4ea4b0300 100644 --- a/runtime/testruntime/testdata/timeseries/models/timeseries_gap_model.sql +++ b/runtime/testruntime/testdata/timeseries/models/timeseries_gap_model.sql @@ -2,7 +2,7 @@ SELECT 1.0 AS clicks, 3 as imps, TIMESTAMP '2019-01-01 00:00:00' AS time, DATE ' UNION ALL SELECT 1.0 AS clicks, 5 as imps, TIMESTAMP '2019-01-03 00:00:00' AS time, DATE '2019-01-03' as day, 'iphone' AS device, null AS publisher, 'msn.com' AS domain, NULL as latitude, NULL as country UNION ALL -SELECT 1.0 AS clicks, 5 as imps, TIMESTAMP '2019-01-06 00:00:00' AS time, DATE '2019-01-06' as day, 'iphone' AS device, null AS publisher, 'msn.com' AS domain, NULL as latitude, NULL as country +SELECT 1.0 AS clicks, 3 as imps, TIMESTAMP '2019-01-06 00:00:00' AS time, DATE '2019-01-06' as day, 'iphone' AS device, null AS publisher, 'msn.com' AS domain, NULL as latitude, NULL as country diff --git a/web-common/src/features/dashboards/dashboard-utils.ts b/web-common/src/features/dashboards/dashboard-utils.ts index 34854ca64a9..fe32a2cdf1d 100644 --- a/web-common/src/features/dashboards/dashboard-utils.ts +++ b/web-common/src/features/dashboards/dashboard-utils.ts @@ -74,7 +74,7 @@ export function prepareSortedQueryBody( { desc: !sortAscending, name: sortMeasureName, - type: querySortType, + sortType: querySortType, }, ], filter: filterForDimension, diff --git a/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts b/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts index 92f588844af..ebb8efc3d77 100644 --- a/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts +++ b/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts @@ -1,5 +1,5 @@ import { - V1MetricsViewComparisonSortType as ApiSortType, + V1MetricsViewComparisonMeasureType as ApiSortType, type V1MetricsViewComparisonRow, type V1MetricsViewComparisonValue, } from "@rilldata/web-common/runtime-client"; @@ -12,7 +12,6 @@ import { SortType } from "../proto-state/derived-types"; * to convert to rows of leaderboard data, we need to extract a single * measure from the dimension table shaped data (namely, the active * measure in the leaderboard). - * @param params */ export function getLabeledComparisonFromComparisonRow( row: V1MetricsViewComparisonRow, @@ -232,28 +231,28 @@ export function getQuerySortType(sortType: SortType) { return ( { [SortType.VALUE]: - ApiSortType.METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, + ApiSortType.METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, [SortType.DELTA_ABSOLUTE]: - ApiSortType.METRICS_VIEW_COMPARISON_SORT_TYPE_ABS_DELTA, + ApiSortType.METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA, [SortType.DELTA_PERCENT]: - ApiSortType.METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA, + ApiSortType.METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA, // NOTE: sorting by percent-of-total has the same effect // as sorting by base value [SortType.PERCENT]: - ApiSortType.METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, + ApiSortType.METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, // NOTE: UNSPECIFIED is not actually a valid sort type, // but it is required by protobuf serialization [SortType.UNSPECIFIED]: - ApiSortType.METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, + ApiSortType.METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, // FIXME: sort by dimension value is not yet implemented, // for now fall back to sorting by base value [SortType.DIMENSION]: - ApiSortType.METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE, - }[sortType] || ApiSortType.METRICS_VIEW_COMPARISON_SORT_TYPE_BASE_VALUE + ApiSortType.METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE, + }[sortType] || ApiSortType.METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE ); } diff --git a/web-common/src/proto/gen/rill/admin/v1/api_pb.ts b/web-common/src/proto/gen/rill/admin/v1/api_pb.ts index 6fbe8ff135b..5883385d130 100644 --- a/web-common/src/proto/gen/rill/admin/v1/api_pb.ts +++ b/web-common/src/proto/gen/rill/admin/v1/api_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/admin/v1/api.proto (package rill.admin.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/admin/v1/internal_pb.ts b/web-common/src/proto/gen/rill/admin/v1/internal_pb.ts index 3b92688ae62..0ac7e143ad6 100644 --- a/web-common/src/proto/gen/rill/admin/v1/internal_pb.ts +++ b/web-common/src/proto/gen/rill/admin/v1/internal_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/admin/v1/internal.proto (package rill.admin.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts index ce47f8fc1ec..1080d9dd437 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/api_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/api.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts index cb25e0673ed..bd42156d0e0 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/catalog.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/colors_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/colors_pb.ts index 786b24957da..cf08f3d5d3f 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/colors_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/colors_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/colors.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts index a25e1184d3d..bb397dccff6 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/connectors.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/export_format_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/export_format_pb.ts index 9b4d2b9613a..be2fb673e52 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/export_format_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/export_format_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/export_format.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/expression_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/expression_pb.ts new file mode 100644 index 00000000000..680dae711e0 --- /dev/null +++ b/web-common/src/proto/gen/rill/runtime/v1/expression_pb.ts @@ -0,0 +1,194 @@ +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" +// @generated from file rill/runtime/v1/expression.proto (package rill.runtime.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3, Value } from "@bufbuild/protobuf"; + +/** + * @generated from enum rill.runtime.v1.Operation + */ +export enum Operation { + /** + * @generated from enum value: OPERATION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: OPERATION_EQ = 1; + */ + EQ = 1, + + /** + * @generated from enum value: OPERATION_NEQ = 2; + */ + NEQ = 2, + + /** + * @generated from enum value: OPERATION_LT = 3; + */ + LT = 3, + + /** + * @generated from enum value: OPERATION_LTE = 4; + */ + LTE = 4, + + /** + * @generated from enum value: OPERATION_GT = 5; + */ + GT = 5, + + /** + * @generated from enum value: OPERATION_GTE = 6; + */ + GTE = 6, + + /** + * @generated from enum value: OPERATION_OR = 7; + */ + OR = 7, + + /** + * @generated from enum value: OPERATION_AND = 8; + */ + AND = 8, + + /** + * @generated from enum value: OPERATION_IN = 9; + */ + IN = 9, + + /** + * @generated from enum value: OPERATION_NIN = 10; + */ + NIN = 10, + + /** + * @generated from enum value: OPERATION_LIKE = 11; + */ + LIKE = 11, + + /** + * @generated from enum value: OPERATION_NLIKE = 12; + */ + NLIKE = 12, +} +// Retrieve enum metadata with: proto3.getEnumType(Operation) +proto3.util.setEnumType(Operation, "rill.runtime.v1.Operation", [ + { no: 0, name: "OPERATION_UNSPECIFIED" }, + { no: 1, name: "OPERATION_EQ" }, + { no: 2, name: "OPERATION_NEQ" }, + { no: 3, name: "OPERATION_LT" }, + { no: 4, name: "OPERATION_LTE" }, + { no: 5, name: "OPERATION_GT" }, + { no: 6, name: "OPERATION_GTE" }, + { no: 7, name: "OPERATION_OR" }, + { no: 8, name: "OPERATION_AND" }, + { no: 9, name: "OPERATION_IN" }, + { no: 10, name: "OPERATION_NIN" }, + { no: 11, name: "OPERATION_LIKE" }, + { no: 12, name: "OPERATION_NLIKE" }, +]); + +/** + * @generated from message rill.runtime.v1.Expression + */ +export class Expression extends Message { + /** + * @generated from oneof rill.runtime.v1.Expression.expression + */ + expression: { + /** + * @generated from field: string ident = 1; + */ + value: string; + case: "ident"; + } | { + /** + * @generated from field: google.protobuf.Value val = 2; + */ + value: Value; + case: "val"; + } | { + /** + * @generated from field: rill.runtime.v1.Condition cond = 3; + */ + value: Condition; + case: "cond"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.Expression"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "ident", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "expression" }, + { no: 2, name: "val", kind: "message", T: Value, oneof: "expression" }, + { no: 3, name: "cond", kind: "message", T: Condition, oneof: "expression" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Expression { + return new Expression().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Expression { + return new Expression().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Expression { + return new Expression().fromJsonString(jsonString, options); + } + + static equals(a: Expression | PlainMessage | undefined, b: Expression | PlainMessage | undefined): boolean { + return proto3.util.equals(Expression, a, b); + } +} + +/** + * @generated from message rill.runtime.v1.Condition + */ +export class Condition extends Message { + /** + * @generated from field: rill.runtime.v1.Operation op = 1; + */ + op = Operation.UNSPECIFIED; + + /** + * @generated from field: repeated rill.runtime.v1.Expression exprs = 2; + */ + exprs: Expression[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.Condition"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "op", kind: "enum", T: proto3.getEnumType(Operation) }, + { no: 2, name: "exprs", kind: "message", T: Expression, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Condition { + return new Condition().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Condition { + return new Condition().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Condition { + return new Condition().fromJsonString(jsonString, options); + } + + static equals(a: Condition | PlainMessage | undefined, b: Condition | PlainMessage | undefined): boolean { + return proto3.util.equals(Condition, a, b); + } +} + diff --git a/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts index c17cf4e6e3e..21d9056b2b8 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/queries.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck @@ -7,6 +7,7 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialM import { Message, proto3, protoInt64, Struct, Timestamp, Value } from "@bufbuild/protobuf"; import { StructType } from "./schema_pb.js"; import { ExportFormat } from "./export_format_pb.js"; +import { Expression } from "./expression_pb.js"; import { TimeGrain } from "./time_grain_pb.js"; /** @@ -36,6 +37,8 @@ proto3.util.setEnumType(BuiltinMeasure, "rill.runtime.v1.BuiltinMeasure", [ ]); /** + * Present for backwards compatibility + * * @generated from enum rill.runtime.v1.MetricsViewComparisonSortType */ export enum MetricsViewComparisonSortType { @@ -73,6 +76,44 @@ proto3.util.setEnumType(MetricsViewComparisonSortType, "rill.runtime.v1.MetricsV { no: 4, name: "METRICS_VIEW_COMPARISON_SORT_TYPE_REL_DELTA" }, ]); +/** + * @generated from enum rill.runtime.v1.MetricsViewComparisonMeasureType + */ +export enum MetricsViewComparisonMeasureType { + /** + * @generated from enum value: METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE = 1; + */ + BASE_VALUE = 1, + + /** + * @generated from enum value: METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE = 2; + */ + COMPARISON_VALUE = 2, + + /** + * @generated from enum value: METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA = 3; + */ + ABS_DELTA = 3, + + /** + * @generated from enum value: METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA = 4; + */ + REL_DELTA = 4, +} +// Retrieve enum metadata with: proto3.getEnumType(MetricsViewComparisonMeasureType) +proto3.util.setEnumType(MetricsViewComparisonMeasureType, "rill.runtime.v1.MetricsViewComparisonMeasureType", [ + { no: 0, name: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED" }, + { no: 1, name: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE" }, + { no: 2, name: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE" }, + { no: 3, name: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA" }, + { no: 4, name: "METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA" }, +]); + /** * @generated from enum rill.runtime.v1.HistogramMethod */ @@ -786,9 +827,14 @@ export class MetricsViewAggregationRequest extends Message) { super(); proto3.util.initPartial(data, this); @@ -821,10 +874,12 @@ export class MetricsViewAggregationRequest extends Message): MetricsViewAggregationRequest { @@ -1083,15 +1138,27 @@ export class MetricsViewToplistRequest extends Message) { super(); proto3.util.initPartial(data, this); @@ -1110,8 +1177,10 @@ export class MetricsViewToplistRequest extends Message): MetricsViewToplistRequest { @@ -1216,9 +1285,19 @@ export class MetricsViewComparisonRequest extends Message) { super(); proto3.util.initPartial(data, this); @@ -1255,11 +1341,14 @@ export class MetricsViewComparisonRequest extends Message): MetricsViewComparisonRequest { @@ -1400,10 +1489,17 @@ export class MetricsViewComparisonSort extends Message) { super(); proto3.util.initPartial(data, this); @@ -1415,6 +1511,7 @@ export class MetricsViewComparisonSort extends Message): MetricsViewComparisonSort { @@ -1538,6 +1635,55 @@ export class MetricsViewComparisonValue extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: rill.runtime.v1.MetricsViewComparisonMeasureType type = 2; + */ + type = MetricsViewComparisonMeasureType.UNSPECIFIED; + + /** + * @generated from field: string alias = 3; + */ + alias = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.MetricsViewComparisonMeasureAlias"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "type", kind: "enum", T: proto3.getEnumType(MetricsViewComparisonMeasureType) }, + { no: 3, name: "alias", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewComparisonMeasureAlias { + return new MetricsViewComparisonMeasureAlias().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): MetricsViewComparisonMeasureAlias { + return new MetricsViewComparisonMeasureAlias().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): MetricsViewComparisonMeasureAlias { + return new MetricsViewComparisonMeasureAlias().fromJsonString(jsonString, options); + } + + static equals(a: MetricsViewComparisonMeasureAlias | PlainMessage | undefined, b: MetricsViewComparisonMeasureAlias | PlainMessage | undefined): boolean { + return proto3.util.equals(MetricsViewComparisonMeasureAlias, a, b); + } +} + /** * @generated from message rill.runtime.v1.MetricsViewTimeSeriesRequest */ @@ -1578,9 +1724,14 @@ export class MetricsViewTimeSeriesRequest extends Message) { super(); proto3.util.initPartial(data, this); @@ -1607,9 +1765,11 @@ export class MetricsViewTimeSeriesRequest extends Message): MetricsViewTimeSeriesRequest { @@ -1707,15 +1867,22 @@ export class MetricsViewTotalsRequest extends Message timeEnd?: Timestamp; /** - * @generated from field: rill.runtime.v1.MetricsViewFilter filter = 7; + * @generated from field: rill.runtime.v1.Expression where = 7; */ - filter?: MetricsViewFilter; + where?: Expression; /** * @generated from field: int32 priority = 8; */ priority = 0; + /** + * Deprecated. should be removed once UI is moved to use new filters + * + * @generated from field: rill.runtime.v1.MetricsViewFilter filter = 10; + */ + filter?: MetricsViewFilter; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -1730,8 +1897,9 @@ export class MetricsViewTotalsRequest extends Message { no: 9, name: "inline_measures", kind: "message", T: InlineMeasure, repeated: true }, { no: 4, name: "time_start", kind: "message", T: Timestamp }, { no: 5, name: "time_end", kind: "message", T: Timestamp }, - { no: 7, name: "filter", kind: "message", T: MetricsViewFilter }, + { no: 7, name: "where", kind: "message", T: Expression }, { no: 8, name: "priority", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + { no: 10, name: "filter", kind: "message", T: MetricsViewFilter }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewTotalsRequest { @@ -1824,9 +1992,9 @@ export class MetricsViewRowsRequest extends Message { timeGranularity = TimeGrain.UNSPECIFIED; /** - * @generated from field: rill.runtime.v1.MetricsViewFilter filter = 5; + * @generated from field: rill.runtime.v1.Expression where = 5; */ - filter?: MetricsViewFilter; + where?: Expression; /** * @generated from field: repeated rill.runtime.v1.MetricsViewSort sort = 6; @@ -1853,6 +2021,13 @@ export class MetricsViewRowsRequest extends Message { */ timeZone = ""; + /** + * Deprecated. should be removed once UI is moved to use new filters + * + * @generated from field: rill.runtime.v1.MetricsViewFilter filter = 12; + */ + filter?: MetricsViewFilter; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -1866,12 +2041,13 @@ export class MetricsViewRowsRequest extends Message { { no: 3, name: "time_start", kind: "message", T: Timestamp }, { no: 4, name: "time_end", kind: "message", T: Timestamp }, { no: 10, name: "time_granularity", kind: "enum", T: proto3.getEnumType(TimeGrain) }, - { no: 5, name: "filter", kind: "message", T: MetricsViewFilter }, + { no: 5, name: "where", kind: "message", T: Expression }, { no: 6, name: "sort", kind: "message", T: MetricsViewSort, repeated: true }, { no: 7, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, { no: 8, name: "offset", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, { no: 9, name: "priority", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, { no: 11, name: "time_zone", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 12, name: "filter", kind: "message", T: MetricsViewFilter }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewRowsRequest { diff --git a/web-common/src/proto/gen/rill/runtime/v1/resources_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/resources_pb.ts index de599b66d7b..954ea9578ee 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/resources_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/resources_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/resources.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/schema_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/schema_pb.ts index b7ae7cee427..8eede117227 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/schema_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/schema_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/schema.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/runtime/v1/time_grain_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/time_grain_pb.ts index e2cd050f981..9d66ea80065 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/time_grain_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/time_grain_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/runtime/v1/time_grain.proto (package rill.runtime.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/web-common/src/proto/gen/rill/ui/v1/dashboard_pb.ts b/web-common/src/proto/gen/rill/ui/v1/dashboard_pb.ts index d896577fcdd..8bd18a5ef46 100644 --- a/web-common/src/proto/gen/rill/ui/v1/dashboard_pb.ts +++ b/web-common/src/proto/gen/rill/ui/v1/dashboard_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.0 with parameter "target=ts" +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts" // @generated from file rill/ui/v1/dashboard.proto (package rill.ui.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck @@ -238,7 +238,7 @@ proto3.util.setEnumType(DashboardState_LeaderboardSortDirection, "rill.ui.v1.Das ]); /** - * * + * * SortType is used to determine how to sort the leaderboard * and dimension detail table, as well as where to place the * sort arrow. diff --git a/web-common/src/runtime-client/gen/index.schemas.ts b/web-common/src/runtime-client/gen/index.schemas.ts index f8134071f71..b737b438722 100644 --- a/web-common/src/runtime-client/gen/index.schemas.ts +++ b/web-common/src/runtime-client/gen/index.schemas.ts @@ -163,11 +163,13 @@ export type QueryServiceMetricsViewTotalsBody = { priority?: number; timeEnd?: string; timeStart?: string; + where?: V1Expression; }; export type QueryServiceMetricsViewToplistBody = { dimensionName?: string; filter?: V1MetricsViewFilter; + having?: V1Expression; inlineMeasures?: V1InlineMeasure[]; limit?: string; measureNames?: string[]; @@ -176,10 +178,12 @@ export type QueryServiceMetricsViewToplistBody = { sort?: V1MetricsViewSort[]; timeEnd?: string; timeStart?: string; + where?: V1Expression; }; export type QueryServiceMetricsViewTimeSeriesBody = { filter?: V1MetricsViewFilter; + having?: V1Expression; inlineMeasures?: V1InlineMeasure[]; measureNames?: string[]; priority?: number; @@ -187,6 +191,7 @@ export type QueryServiceMetricsViewTimeSeriesBody = { timeGranularity?: V1TimeGrain; timeStart?: string; timeZone?: string; + where?: V1Expression; }; export type QueryServiceMetricsViewTimeRangeBody = { @@ -203,24 +208,29 @@ export type QueryServiceMetricsViewRowsBody = { timeGranularity?: V1TimeGrain; timeStart?: string; timeZone?: string; + where?: V1Expression; }; export type QueryServiceMetricsViewComparisonBody = { + aliases?: V1MetricsViewComparisonMeasureAlias[]; comparisonTimeRange?: V1TimeRange; dimension?: V1MetricsViewAggregationDimension; exact?: boolean; filter?: V1MetricsViewFilter; + having?: V1Expression; limit?: string; measures?: V1MetricsViewAggregationMeasure[]; offset?: string; priority?: number; sort?: V1MetricsViewComparisonSort[]; timeRange?: V1TimeRange; + where?: V1Expression; }; export type QueryServiceMetricsViewAggregationBody = { dimensions?: V1MetricsViewAggregationDimension[]; filter?: V1MetricsViewFilter; + having?: V1Expression; limit?: string; measures?: V1MetricsViewAggregationMeasure[]; offset?: string; @@ -229,6 +239,7 @@ export type QueryServiceMetricsViewAggregationBody = { timeEnd?: string; timeRange?: V1TimeRange; timeStart?: string; + where?: V1Expression; }; export type QueryServiceExportBody = { @@ -998,6 +1009,25 @@ export interface V1ParseError { startLocation?: Runtimev1CharLocation; } +export type V1Operation = (typeof V1Operation)[keyof typeof V1Operation]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const V1Operation = { + OPERATION_UNSPECIFIED: "OPERATION_UNSPECIFIED", + OPERATION_EQ: "OPERATION_EQ", + OPERATION_NEQ: "OPERATION_NEQ", + OPERATION_LT: "OPERATION_LT", + OPERATION_LTE: "OPERATION_LTE", + OPERATION_GT: "OPERATION_GT", + OPERATION_GTE: "OPERATION_GTE", + OPERATION_OR: "OPERATION_OR", + OPERATION_AND: "OPERATION_AND", + OPERATION_IN: "OPERATION_IN", + OPERATION_NIN: "OPERATION_NIN", + OPERATION_LIKE: "OPERATION_LIKE", + OPERATION_NLIKE: "OPERATION_NLIKE", +} as const; + export type V1ObjectType = (typeof V1ObjectType)[keyof typeof V1ObjectType]; // eslint-disable-next-line @typescript-eslint/no-redeclare @@ -1101,6 +1131,18 @@ export interface V1MetricsViewTotalsResponse { meta?: V1MetricsViewColumn[]; } +export interface V1MetricsViewTotalsRequest { + filter?: V1MetricsViewFilter; + inlineMeasures?: V1InlineMeasure[]; + instanceId?: string; + measureNames?: string[]; + metricsViewName?: string; + priority?: number; + timeEnd?: string; + timeStart?: string; + where?: V1Expression; +} + export type V1MetricsViewToplistResponseDataItem = { [key: string]: any }; export interface V1MetricsViewToplistResponse { @@ -1113,6 +1155,21 @@ export interface V1MetricsViewTimeSeriesResponse { meta?: V1MetricsViewColumn[]; } +export interface V1MetricsViewTimeSeriesRequest { + filter?: V1MetricsViewFilter; + having?: V1Expression; + inlineMeasures?: V1InlineMeasure[]; + instanceId?: string; + measureNames?: string[]; + metricsViewName?: string; + priority?: number; + timeEnd?: string; + timeGranularity?: V1TimeGrain; + timeStart?: string; + timeZone?: string; + where?: V1Expression; +} + export interface V1MetricsViewTimeRangeResponse { timeRangeSummary?: V1TimeRangeSummary; } @@ -1162,20 +1219,10 @@ export interface V1MetricsViewFilter { include?: MetricsViewFilterCond[]; } -export interface V1MetricsViewTotalsRequest { - filter?: V1MetricsViewFilter; - inlineMeasures?: V1InlineMeasure[]; - instanceId?: string; - measureNames?: string[]; - metricsViewName?: string; - priority?: number; - timeEnd?: string; - timeStart?: string; -} - export interface V1MetricsViewToplistRequest { dimensionName?: string; filter?: V1MetricsViewFilter; + having?: V1Expression; inlineMeasures?: V1InlineMeasure[]; instanceId?: string; limit?: string; @@ -1186,19 +1233,7 @@ export interface V1MetricsViewToplistRequest { sort?: V1MetricsViewSort[]; timeEnd?: string; timeStart?: string; -} - -export interface V1MetricsViewTimeSeriesRequest { - filter?: V1MetricsViewFilter; - inlineMeasures?: V1InlineMeasure[]; - instanceId?: string; - measureNames?: string[]; - metricsViewName?: string; - priority?: number; - timeEnd?: string; - timeGranularity?: V1TimeGrain; - timeStart?: string; - timeZone?: string; + where?: V1Expression; } export interface V1MetricsViewRowsRequest { @@ -1213,6 +1248,7 @@ export interface V1MetricsViewRowsRequest { timeGranularity?: V1TimeGrain; timeStart?: string; timeZone?: string; + where?: V1Expression; } export interface V1MetricsViewComparisonValue { @@ -1243,6 +1279,7 @@ export const V1MetricsViewComparisonSortType = { export interface V1MetricsViewComparisonSort { desc?: boolean; name?: string; + sortType?: V1MetricsViewComparisonMeasureType; type?: V1MetricsViewComparisonSortType; } @@ -1255,6 +1292,29 @@ export interface V1MetricsViewComparisonResponse { rows?: V1MetricsViewComparisonRow[]; } +export type V1MetricsViewComparisonMeasureType = + (typeof V1MetricsViewComparisonMeasureType)[keyof typeof V1MetricsViewComparisonMeasureType]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const V1MetricsViewComparisonMeasureType = { + METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED: + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_UNSPECIFIED", + METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE: + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_BASE_VALUE", + METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE: + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_COMPARISON_VALUE", + METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA: + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_ABS_DELTA", + METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA: + "METRICS_VIEW_COMPARISON_MEASURE_TYPE_REL_DELTA", +} as const; + +export interface V1MetricsViewComparisonMeasureAlias { + alias?: string; + name?: string; + type?: V1MetricsViewComparisonMeasureType; +} + export interface V1MetricsViewColumn { name?: string; nullable?: boolean; @@ -1285,24 +1345,10 @@ export interface V1MetricsViewAggregationDimension { timeZone?: string; } -export interface V1MetricsViewComparisonRequest { - comparisonTimeRange?: V1TimeRange; - dimension?: V1MetricsViewAggregationDimension; - exact?: boolean; - filter?: V1MetricsViewFilter; - instanceId?: string; - limit?: string; - measures?: V1MetricsViewAggregationMeasure[]; - metricsViewName?: string; - offset?: string; - priority?: number; - sort?: V1MetricsViewComparisonSort[]; - timeRange?: V1TimeRange; -} - export interface V1MetricsViewAggregationRequest { dimensions?: V1MetricsViewAggregationDimension[]; filter?: V1MetricsViewFilter; + having?: V1Expression; instanceId?: string; limit?: string; measures?: V1MetricsViewAggregationMeasure[]; @@ -1313,6 +1359,7 @@ export interface V1MetricsViewAggregationRequest { timeEnd?: string; timeRange?: V1TimeRange; timeStart?: string; + where?: V1Expression; } export interface V1MetricsView { @@ -1488,6 +1535,30 @@ export const V1FileEvent = { FILE_EVENT_DELETE: "FILE_EVENT_DELETE", } as const; +export interface V1Expression { + cond?: V1Condition; + ident?: string; + val?: unknown; +} + +export interface V1MetricsViewComparisonRequest { + aliases?: V1MetricsViewComparisonMeasureAlias[]; + comparisonTimeRange?: V1TimeRange; + dimension?: V1MetricsViewAggregationDimension; + exact?: boolean; + filter?: V1MetricsViewFilter; + having?: V1Expression; + instanceId?: string; + limit?: string; + measures?: V1MetricsViewAggregationMeasure[]; + metricsViewName?: string; + offset?: string; + priority?: number; + sort?: V1MetricsViewComparisonSort[]; + timeRange?: V1TimeRange; + where?: V1Expression; +} + export interface V1ExportResponse { downloadUrlPath?: string; } @@ -1593,6 +1664,11 @@ export interface V1Connector { type?: string; } +export interface V1Condition { + exprs?: V1Expression[]; + op?: V1Operation; +} + export interface V1ColumnTopKResponse { categoricalSummary?: V1CategoricalSummary; } @@ -1702,11 +1778,6 @@ export interface V1ColumnDescriptiveStatisticsRequest { tableName?: string; } -export interface V1CategoricalSummary { - cardinality?: number; - topK?: V1TopK; -} - export interface V1ColumnCardinalityResponse { categoricalSummary?: V1CategoricalSummary; } @@ -1725,6 +1796,11 @@ export interface V1Color { red?: number; } +export interface V1CategoricalSummary { + cardinality?: number; + topK?: V1TopK; +} + export interface V1CatalogEntry { children?: string[]; createdOn?: string;