Преглед изворни кода

按照新的接口修改sdk

yjp пре 1 година
родитељ
комит
3fc88b0d9e

+ 63 - 75
dpsv1/client.go

@@ -10,6 +10,7 @@ import (
 	"git.sxidc.com/service-supports/dps-sdk/ports"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials/insecure"
+	"reflect"
 	"time"
 )
 
@@ -71,12 +72,7 @@ func (c *Client) AutoMigrate(req *ports.AutoMigrateRequest) error {
 }
 
 func (c *Client) Insert(req *ports.InsertRequest) (string, error) {
-	keysJsonBytes, err := json.Marshal(req.Keys)
-	if err != nil {
-		return "", err
-	}
-
-	tableRowJsonBytes, err := json.Marshal(req.TableRow)
+	tableRowJsonBytes, err := c.formTableRow(req.TableRow)
 	if err != nil {
 		return "", err
 	}
@@ -85,7 +81,7 @@ func (c *Client) Insert(req *ports.InsertRequest) (string, error) {
 		DatabaseID:            req.DatabaseID,
 		TablePrefixWithSchema: req.TablePrefixWithSchema,
 		Version:               req.Version,
-		Keys:                  keysJsonBytes,
+		KeyColumns:            req.KeyColumns,
 		TableRow:              tableRowJsonBytes,
 		UserID:                req.UserID,
 	})
@@ -97,16 +93,11 @@ func (c *Client) Insert(req *ports.InsertRequest) (string, error) {
 }
 
 func (c *Client) Delete(req *ports.DeleteRequest) (string, error) {
-	keysJsonBytes, err := json.Marshal(req.Keys)
-	if err != nil {
-		return "", err
-	}
-
 	reply, err := c.commandServiceClient.Delete(context.Background(), &request.DeleteRequest{
 		DatabaseID:            req.DatabaseID,
 		TablePrefixWithSchema: req.TablePrefixWithSchema,
 		Version:               req.Version,
-		Keys:                  keysJsonBytes,
+		KeyValues:             req.KeyValues,
 		UserID:                req.UserID,
 	})
 	if err != nil {
@@ -119,12 +110,7 @@ func (c *Client) Delete(req *ports.DeleteRequest) (string, error) {
 // TODO DeleteBatch
 
 func (c *Client) Update(req *ports.UpdateRequest) (string, error) {
-	keysJsonBytes, err := json.Marshal(req.Keys)
-	if err != nil {
-		return "", err
-	}
-
-	newTableRowJsonByte, err := json.Marshal(req.NewTableRow)
+	newTableRowJsonByte, err := c.formTableRow(req.NewTableRow)
 	if err != nil {
 		return "", err
 	}
@@ -133,7 +119,7 @@ func (c *Client) Update(req *ports.UpdateRequest) (string, error) {
 		DatabaseID:            req.DatabaseID,
 		TablePrefixWithSchema: req.TablePrefixWithSchema,
 		Version:               req.Version,
-		Keys:                  keysJsonBytes,
+		KeyValues:             req.KeyValues,
 		NewTableRow:           newTableRowJsonByte,
 		UserID:                req.UserID,
 	})
@@ -145,16 +131,11 @@ func (c *Client) Update(req *ports.UpdateRequest) (string, error) {
 }
 
 func (c *Client) Replay(req *ports.ReplayRequest) (string, error) {
-	keysJsonBytes, err := json.Marshal(req.Keys)
-	if err != nil {
-		return "", err
-	}
-
 	reply, err := c.commandServiceClient.Replay(context.Background(), &request.ReplayRequest{
 		DatabaseID:            req.DatabaseID,
 		TablePrefixWithSchema: req.TablePrefixWithSchema,
 		Version:               req.Version,
-		Keys:                  keysJsonBytes,
+		KeyValues:             req.KeyValues,
 		UserID:                req.UserID,
 	})
 	if err != nil {
@@ -235,60 +216,12 @@ func (c *Client) CommonQuery(req *ports.CommonQueryRequest) (string, []map[strin
 }
 
 func (c *Client) QueryByKeys(req *ports.QueryByKeysRequest) (string, map[string]any, error) {
-	keysJsonBytes, err := json.Marshal(req.Keys)
-	if err != nil {
-		return "", nil, err
-	}
-
-	whereJsonBytes, err := json.Marshal(req.Where)
-	if err != nil {
-		return "", nil, err
-	}
-
 	reply, err := c.queryServiceClient.QueryByKeys(context.Background(), &request.QueryByKeysRequest{
 		DatabaseID:            req.DatabaseID,
 		TablePrefixWithSchema: req.TablePrefixWithSchema,
 		Version:               req.Version,
 		Select:                req.Select,
-		Keys:                  keysJsonBytes,
-		Where:                 whereJsonBytes,
-	})
-	if err != nil {
-		return "", nil, err
-	}
-
-	infoMap, err := c.infoDataToInfoMap(reply.Info)
-	if err != nil {
-		return "", nil, err
-	}
-
-	return reply.Statement, infoMap, nil
-}
-
-func (c *Client) CommonQueryByKeys(req *ports.CommonQueryByKeysRequest) (string, map[string]any, error) {
-	keysJsonBytes, err := json.Marshal(req.Keys)
-	if err != nil {
-		return "", nil, err
-	}
-
-	whereJsonBytes, err := json.Marshal(req.Where)
-	if err != nil {
-		return "", nil, err
-	}
-
-	orJsonBytes, err := json.Marshal(req.Or)
-	if err != nil {
-		return "", nil, err
-	}
-
-	reply, err := c.queryServiceClient.CommonQueryByKeys(context.Background(), &request.CommonQueryByKeysRequest{
-		DatabaseID:            req.DatabaseID,
-		TablePrefixWithSchema: req.TablePrefixWithSchema,
-		Version:               req.Version,
-		Select:                req.Select,
-		Keys:                  keysJsonBytes,
-		Where:                 whereJsonBytes,
-		Or:                    orJsonBytes,
+		KeyValues:             req.KeyValues,
 	})
 	if err != nil {
 		return "", nil, err
@@ -358,6 +291,59 @@ func (c *Client) CommonCount(req *ports.CommonCountRequest) (string, int64, erro
 	return reply.Statement, reply.Count, nil
 }
 
+func (c *Client) formTableRow(tableRow map[string]any) (*request.TableRow, error) {
+	if tableRow == nil || len(tableRow) == 0 {
+		return &request.TableRow{Columns: make([]*request.Column, 0)}, nil
+	}
+
+	columns := make([]*request.Column, 0)
+	for columnName, value := range tableRow {
+		valueType := reflect.TypeOf(value)
+		if valueType.Kind() == reflect.Ptr {
+			reflectValue := reflect.ValueOf(value).Elem()
+			valueType = reflectValue.Type()
+			value = reflectValue.Interface()
+		}
+
+		typedValue := new(request.ColumnValue)
+		typedValue.Kind = int32(valueType.Kind())
+		typedValue.Type = valueType.Name()
+
+		switch valueType.Name() {
+		case "Time":
+			timeObj := value.(time.Time)
+			typedValue.TypedValue = &request.ColumnValue_Uint64Value{Uint64Value: uint64(timeObj.UnixNano())}
+		case "string":
+			typedValue.TypedValue = &request.ColumnValue_StringValue{StringValue: value.(string)}
+		case "bool":
+			typedValue.TypedValue = &request.ColumnValue_BoolValue{BoolValue: value.(bool)}
+		case "int":
+			typedValue.TypedValue = &request.ColumnValue_Uint32Value{Uint32Value: uint32(value.(int))}
+		case "int32":
+			typedValue.TypedValue = &request.ColumnValue_Uint32Value{Uint32Value: uint32(value.(int32))}
+		case "int64":
+			typedValue.TypedValue = &request.ColumnValue_Uint64Value{Uint64Value: uint64(value.(int64))}
+		case "uint32":
+			typedValue.TypedValue = &request.ColumnValue_Uint32Value{Uint32Value: value.(uint32)}
+		case "uint64":
+			typedValue.TypedValue = &request.ColumnValue_Uint64Value{Uint64Value: value.(uint64)}
+		case "float32":
+			typedValue.TypedValue = &request.ColumnValue_Float64Value{Float64Value: float64(value.(float32))}
+		case "float64":
+			typedValue.TypedValue = &request.ColumnValue_Float64Value{Float64Value: value.(float64)}
+		default:
+			return nil, errors.New("不支持的数据类型" + valueType.Name())
+		}
+
+		columns = append(columns, &request.Column{
+			Name:  columnName,
+			Value: typedValue,
+		})
+	}
+
+	return &request.TableRow{Columns: columns}, nil
+}
+
 func (c *Client) infoDataToInfoMap(infoData *response.InfoData) (map[string]any, error) {
 	retInfoMap := make(map[string]any)
 
@@ -370,6 +356,8 @@ func (c *Client) infoDataToInfoMap(infoData *response.InfoData) (map[string]any,
 			retInfoMap[column.Name] = column.Value.GetStringValue()
 		case "bool":
 			retInfoMap[column.Name] = column.Value.GetBoolValue()
+		case "int":
+			retInfoMap[column.Name] = int(column.Value.GetUint32Value())
 		case "int32":
 			retInfoMap[column.Name] = int(column.Value.GetUint32Value())
 		case "int64":

+ 26 - 34
pb/v1/query.pb.go

@@ -28,7 +28,7 @@ var file_v1_query_proto_rawDesc = []byte{
 	0x12, 0x02, 0x76, 0x31, 0x1a, 0x16, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 	0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x31,
 	0x2f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xe4, 0x03, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x8b, 0x03, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53,
 	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42,
 	0x79, 0x57, 0x68, 0x65, 0x72, 0x65, 0x41, 0x6e, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79,
 	0x12, 0x26, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79,
@@ -44,51 +44,43 @@ var file_v1_query_proto_rawDesc = []byte{
 	0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 	0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
-	0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x21, 0x2e, 0x72,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x51, 0x75, 0x65,
-	0x72, 0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1d, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79,
-	0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
-	0x12, 0x43, 0x0a, 0x0a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x57, 0x68, 0x65, 0x72, 0x65, 0x12, 0x1a,
-	0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x57, 0x68,
-	0x65, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43,
-	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43,
-	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x57, 0x68, 0x65, 0x72, 0x65, 0x12, 0x1a, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x57, 0x68, 0x65, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 	0x74, 0x1a, 0x17, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x75,
-	0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x18, 0x5a, 0x16,
-	0x64, 0x70, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69,
-	0x2f, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0b,
+	0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x72, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x42, 0x18, 0x5a, 0x16, 0x64, 0x70, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
+	0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var file_v1_query_proto_goTypes = []interface{}{
 	(*request.QueryByWhereAndOrderByRequest)(nil), // 0: request.QueryByWhereAndOrderByRequest
 	(*request.CommonQueryRequest)(nil),            // 1: request.CommonQueryRequest
 	(*request.QueryByKeysRequest)(nil),            // 2: request.QueryByKeysRequest
-	(*request.CommonQueryByKeysRequest)(nil),      // 3: request.CommonQueryByKeysRequest
-	(*request.CountWhereRequest)(nil),             // 4: request.CountWhereRequest
-	(*request.CommonCountRequest)(nil),            // 5: request.CommonCountRequest
-	(*response.QueryResponse)(nil),                // 6: response.QueryResponse
-	(*response.QueryByKeysResponse)(nil),          // 7: response.QueryByKeysResponse
-	(*response.CountResponse)(nil),                // 8: response.CountResponse
+	(*request.CountWhereRequest)(nil),             // 3: request.CountWhereRequest
+	(*request.CommonCountRequest)(nil),            // 4: request.CommonCountRequest
+	(*response.QueryResponse)(nil),                // 5: response.QueryResponse
+	(*response.QueryByKeysResponse)(nil),          // 6: response.QueryByKeysResponse
+	(*response.CountResponse)(nil),                // 7: response.CountResponse
 }
 var file_v1_query_proto_depIdxs = []int32{
 	0, // 0: v1.QueryService.QueryByWhereAndOrderBy:input_type -> request.QueryByWhereAndOrderByRequest
 	1, // 1: v1.QueryService.CommonQuery:input_type -> request.CommonQueryRequest
 	2, // 2: v1.QueryService.QueryByKeys:input_type -> request.QueryByKeysRequest
-	3, // 3: v1.QueryService.CommonQueryByKeys:input_type -> request.CommonQueryByKeysRequest
-	4, // 4: v1.QueryService.CountWhere:input_type -> request.CountWhereRequest
-	5, // 5: v1.QueryService.CommonCount:input_type -> request.CommonCountRequest
-	6, // 6: v1.QueryService.QueryByWhereAndOrderBy:output_type -> response.QueryResponse
-	6, // 7: v1.QueryService.CommonQuery:output_type -> response.QueryResponse
-	7, // 8: v1.QueryService.QueryByKeys:output_type -> response.QueryByKeysResponse
-	7, // 9: v1.QueryService.CommonQueryByKeys:output_type -> response.QueryByKeysResponse
-	8, // 10: v1.QueryService.CountWhere:output_type -> response.CountResponse
-	8, // 11: v1.QueryService.CommonCount:output_type -> response.CountResponse
-	6, // [6:12] is the sub-list for method output_type
-	0, // [0:6] is the sub-list for method input_type
+	3, // 3: v1.QueryService.CountWhere:input_type -> request.CountWhereRequest
+	4, // 4: v1.QueryService.CommonCount:input_type -> request.CommonCountRequest
+	5, // 5: v1.QueryService.QueryByWhereAndOrderBy:output_type -> response.QueryResponse
+	5, // 6: v1.QueryService.CommonQuery:output_type -> response.QueryResponse
+	6, // 7: v1.QueryService.QueryByKeys:output_type -> response.QueryByKeysResponse
+	7, // 8: v1.QueryService.CountWhere:output_type -> response.CountResponse
+	7, // 9: v1.QueryService.CommonCount:output_type -> response.CountResponse
+	5, // [5:10] is the sub-list for method output_type
+	0, // [0:5] is the sub-list for method input_type
 	0, // [0:0] is the sub-list for extension type_name
 	0, // [0:0] is the sub-list for extension extendee
 	0, // [0:0] is the sub-list for field type_name

+ 0 - 36
pb/v1/query_grpc.pb.go

@@ -27,7 +27,6 @@ type QueryServiceClient interface {
 	QueryByWhereAndOrderBy(ctx context.Context, in *request.QueryByWhereAndOrderByRequest, opts ...grpc.CallOption) (*response.QueryResponse, error)
 	CommonQuery(ctx context.Context, in *request.CommonQueryRequest, opts ...grpc.CallOption) (*response.QueryResponse, error)
 	QueryByKeys(ctx context.Context, in *request.QueryByKeysRequest, opts ...grpc.CallOption) (*response.QueryByKeysResponse, error)
-	CommonQueryByKeys(ctx context.Context, in *request.CommonQueryByKeysRequest, opts ...grpc.CallOption) (*response.QueryByKeysResponse, error)
 	CountWhere(ctx context.Context, in *request.CountWhereRequest, opts ...grpc.CallOption) (*response.CountResponse, error)
 	CommonCount(ctx context.Context, in *request.CommonCountRequest, opts ...grpc.CallOption) (*response.CountResponse, error)
 }
@@ -67,15 +66,6 @@ func (c *queryServiceClient) QueryByKeys(ctx context.Context, in *request.QueryB
 	return out, nil
 }
 
-func (c *queryServiceClient) CommonQueryByKeys(ctx context.Context, in *request.CommonQueryByKeysRequest, opts ...grpc.CallOption) (*response.QueryByKeysResponse, error) {
-	out := new(response.QueryByKeysResponse)
-	err := c.cc.Invoke(ctx, "/v1.QueryService/CommonQueryByKeys", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
 func (c *queryServiceClient) CountWhere(ctx context.Context, in *request.CountWhereRequest, opts ...grpc.CallOption) (*response.CountResponse, error) {
 	out := new(response.CountResponse)
 	err := c.cc.Invoke(ctx, "/v1.QueryService/CountWhere", in, out, opts...)
@@ -101,7 +91,6 @@ type QueryServiceServer interface {
 	QueryByWhereAndOrderBy(context.Context, *request.QueryByWhereAndOrderByRequest) (*response.QueryResponse, error)
 	CommonQuery(context.Context, *request.CommonQueryRequest) (*response.QueryResponse, error)
 	QueryByKeys(context.Context, *request.QueryByKeysRequest) (*response.QueryByKeysResponse, error)
-	CommonQueryByKeys(context.Context, *request.CommonQueryByKeysRequest) (*response.QueryByKeysResponse, error)
 	CountWhere(context.Context, *request.CountWhereRequest) (*response.CountResponse, error)
 	CommonCount(context.Context, *request.CommonCountRequest) (*response.CountResponse, error)
 	mustEmbedUnimplementedQueryServiceServer()
@@ -120,9 +109,6 @@ func (UnimplementedQueryServiceServer) CommonQuery(context.Context, *request.Com
 func (UnimplementedQueryServiceServer) QueryByKeys(context.Context, *request.QueryByKeysRequest) (*response.QueryByKeysResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method QueryByKeys not implemented")
 }
-func (UnimplementedQueryServiceServer) CommonQueryByKeys(context.Context, *request.CommonQueryByKeysRequest) (*response.QueryByKeysResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method CommonQueryByKeys not implemented")
-}
 func (UnimplementedQueryServiceServer) CountWhere(context.Context, *request.CountWhereRequest) (*response.CountResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method CountWhere not implemented")
 }
@@ -196,24 +182,6 @@ func _QueryService_QueryByKeys_Handler(srv interface{}, ctx context.Context, dec
 	return interceptor(ctx, in, info, handler)
 }
 
-func _QueryService_CommonQueryByKeys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(request.CommonQueryByKeysRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(QueryServiceServer).CommonQueryByKeys(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/v1.QueryService/CommonQueryByKeys",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(QueryServiceServer).CommonQueryByKeys(ctx, req.(*request.CommonQueryByKeysRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
 func _QueryService_CountWhere_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(request.CountWhereRequest)
 	if err := dec(in); err != nil {
@@ -269,10 +237,6 @@ var QueryService_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "QueryByKeys",
 			Handler:    _QueryService_QueryByKeys_Handler,
 		},
-		{
-			MethodName: "CommonQueryByKeys",
-			Handler:    _QueryService_CommonQueryByKeys_Handler,
-		},
 		{
 			MethodName: "CountWhere",
 			Handler:    _QueryService_CountWhere_Handler,

+ 500 - 144
pb/v1/request/command.pb.go

@@ -248,12 +248,12 @@ type InsertRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	DatabaseID            string `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
-	TablePrefixWithSchema string `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
-	Version               string `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
-	Keys                  []byte `protobuf:"bytes,4,opt,name=Keys,proto3" json:"Keys,omitempty"`
-	TableRow              []byte `protobuf:"bytes,5,opt,name=TableRow,proto3" json:"TableRow,omitempty"`
-	UserID                string `protobuf:"bytes,6,opt,name=UserID,proto3" json:"UserID,omitempty"`
+	DatabaseID            string    `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
+	TablePrefixWithSchema string    `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
+	Version               string    `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
+	KeyColumns            []string  `protobuf:"bytes,4,rep,name=KeyColumns,proto3" json:"KeyColumns,omitempty"`
+	TableRow              *TableRow `protobuf:"bytes,5,opt,name=TableRow,proto3" json:"TableRow,omitempty"`
+	UserID                string    `protobuf:"bytes,6,opt,name=UserID,proto3" json:"UserID,omitempty"`
 }
 
 func (x *InsertRequest) Reset() {
@@ -309,14 +309,14 @@ func (x *InsertRequest) GetVersion() string {
 	return ""
 }
 
-func (x *InsertRequest) GetKeys() []byte {
+func (x *InsertRequest) GetKeyColumns() []string {
 	if x != nil {
-		return x.Keys
+		return x.KeyColumns
 	}
 	return nil
 }
 
-func (x *InsertRequest) GetTableRow() []byte {
+func (x *InsertRequest) GetTableRow() *TableRow {
 	if x != nil {
 		return x.TableRow
 	}
@@ -461,8 +461,8 @@ type InsertItem struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Keys     []byte `protobuf:"bytes,1,opt,name=Keys,proto3" json:"Keys,omitempty"`
-	TableRow []byte `protobuf:"bytes,2,opt,name=TableRow,proto3" json:"TableRow,omitempty"`
+	KeyColumns []string  `protobuf:"bytes,1,rep,name=KeyColumns,proto3" json:"KeyColumns,omitempty"`
+	TableRow   *TableRow `protobuf:"bytes,2,opt,name=TableRow,proto3" json:"TableRow,omitempty"`
 }
 
 func (x *InsertItem) Reset() {
@@ -497,14 +497,14 @@ func (*InsertItem) Descriptor() ([]byte, []int) {
 	return file_v1_request_command_proto_rawDescGZIP(), []int{5}
 }
 
-func (x *InsertItem) GetKeys() []byte {
+func (x *InsertItem) GetKeyColumns() []string {
 	if x != nil {
-		return x.Keys
+		return x.KeyColumns
 	}
 	return nil
 }
 
-func (x *InsertItem) GetTableRow() []byte {
+func (x *InsertItem) GetTableRow() *TableRow {
 	if x != nil {
 		return x.TableRow
 	}
@@ -516,11 +516,11 @@ type DeleteRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	DatabaseID            string `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
-	TablePrefixWithSchema string `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
-	Version               string `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
-	Keys                  []byte `protobuf:"bytes,4,opt,name=Keys,proto3" json:"Keys,omitempty"`
-	UserID                string `protobuf:"bytes,5,opt,name=UserID,proto3" json:"UserID,omitempty"`
+	DatabaseID            string            `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
+	TablePrefixWithSchema string            `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
+	Version               string            `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
+	KeyValues             map[string]string `protobuf:"bytes,4,rep,name=KeyValues,proto3" json:"KeyValues,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	UserID                string            `protobuf:"bytes,5,opt,name=UserID,proto3" json:"UserID,omitempty"`
 }
 
 func (x *DeleteRequest) Reset() {
@@ -576,9 +576,9 @@ func (x *DeleteRequest) GetVersion() string {
 	return ""
 }
 
-func (x *DeleteRequest) GetKeys() []byte {
+func (x *DeleteRequest) GetKeyValues() map[string]string {
 	if x != nil {
-		return x.Keys
+		return x.KeyValues
 	}
 	return nil
 }
@@ -721,7 +721,7 @@ type DeleteItem struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Keys []byte `protobuf:"bytes,1,opt,name=Keys,proto3" json:"Keys,omitempty"`
+	KeyValues map[string]string `protobuf:"bytes,1,rep,name=KeyValues,proto3" json:"KeyValues,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 }
 
 func (x *DeleteItem) Reset() {
@@ -756,9 +756,9 @@ func (*DeleteItem) Descriptor() ([]byte, []int) {
 	return file_v1_request_command_proto_rawDescGZIP(), []int{9}
 }
 
-func (x *DeleteItem) GetKeys() []byte {
+func (x *DeleteItem) GetKeyValues() map[string]string {
 	if x != nil {
-		return x.Keys
+		return x.KeyValues
 	}
 	return nil
 }
@@ -768,12 +768,12 @@ type UpdateRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	DatabaseID            string `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
-	TablePrefixWithSchema string `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
-	Version               string `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
-	Keys                  []byte `protobuf:"bytes,4,opt,name=Keys,proto3" json:"Keys,omitempty"`
-	NewTableRow           []byte `protobuf:"bytes,5,opt,name=NewTableRow,proto3" json:"NewTableRow,omitempty"`
-	UserID                string `protobuf:"bytes,6,opt,name=UserID,proto3" json:"UserID,omitempty"`
+	DatabaseID            string            `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
+	TablePrefixWithSchema string            `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
+	Version               string            `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
+	KeyValues             map[string]string `protobuf:"bytes,4,rep,name=KeyValues,proto3" json:"KeyValues,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	NewTableRow           *TableRow         `protobuf:"bytes,5,opt,name=NewTableRow,proto3" json:"NewTableRow,omitempty"`
+	UserID                string            `protobuf:"bytes,6,opt,name=UserID,proto3" json:"UserID,omitempty"`
 }
 
 func (x *UpdateRequest) Reset() {
@@ -829,14 +829,14 @@ func (x *UpdateRequest) GetVersion() string {
 	return ""
 }
 
-func (x *UpdateRequest) GetKeys() []byte {
+func (x *UpdateRequest) GetKeyValues() map[string]string {
 	if x != nil {
-		return x.Keys
+		return x.KeyValues
 	}
 	return nil
 }
 
-func (x *UpdateRequest) GetNewTableRow() []byte {
+func (x *UpdateRequest) GetNewTableRow() *TableRow {
 	if x != nil {
 		return x.NewTableRow
 	}
@@ -855,11 +855,11 @@ type ReplayRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	DatabaseID            string `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
-	TablePrefixWithSchema string `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
-	Version               string `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
-	Keys                  []byte `protobuf:"bytes,4,opt,name=Keys,proto3" json:"Keys,omitempty"`
-	UserID                string `protobuf:"bytes,5,opt,name=UserID,proto3" json:"UserID,omitempty"`
+	DatabaseID            string            `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
+	TablePrefixWithSchema string            `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
+	Version               string            `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
+	KeyValues             map[string]string `protobuf:"bytes,4,rep,name=KeyValues,proto3" json:"KeyValues,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	UserID                string            `protobuf:"bytes,5,opt,name=UserID,proto3" json:"UserID,omitempty"`
 }
 
 func (x *ReplayRequest) Reset() {
@@ -915,9 +915,9 @@ func (x *ReplayRequest) GetVersion() string {
 	return ""
 }
 
-func (x *ReplayRequest) GetKeys() []byte {
+func (x *ReplayRequest) GetKeyValues() map[string]string {
 	if x != nil {
-		return x.Keys
+		return x.KeyValues
 	}
 	return nil
 }
@@ -1014,6 +1014,247 @@ func (*TransactionEndRequest) Descriptor() ([]byte, []int) {
 	return file_v1_request_command_proto_rawDescGZIP(), []int{13}
 }
 
+type TableRow struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Columns []*Column `protobuf:"bytes,1,rep,name=Columns,proto3" json:"Columns,omitempty"`
+}
+
+func (x *TableRow) Reset() {
+	*x = TableRow{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v1_request_command_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TableRow) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TableRow) ProtoMessage() {}
+
+func (x *TableRow) ProtoReflect() protoreflect.Message {
+	mi := &file_v1_request_command_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use TableRow.ProtoReflect.Descriptor instead.
+func (*TableRow) Descriptor() ([]byte, []int) {
+	return file_v1_request_command_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *TableRow) GetColumns() []*Column {
+	if x != nil {
+		return x.Columns
+	}
+	return nil
+}
+
+type Column struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name  string       `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
+	Value *ColumnValue `protobuf:"bytes,2,opt,name=Value,proto3" json:"Value,omitempty"`
+}
+
+func (x *Column) Reset() {
+	*x = Column{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v1_request_command_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Column) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Column) ProtoMessage() {}
+
+func (x *Column) ProtoReflect() protoreflect.Message {
+	mi := &file_v1_request_command_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Column.ProtoReflect.Descriptor instead.
+func (*Column) Descriptor() ([]byte, []int) {
+	return file_v1_request_command_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *Column) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Column) GetValue() *ColumnValue {
+	if x != nil {
+		return x.Value
+	}
+	return nil
+}
+
+type ColumnValue struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Kind int32  `protobuf:"varint,1,opt,name=Kind,proto3" json:"Kind,omitempty"`
+	Type string `protobuf:"bytes,2,opt,name=Type,proto3" json:"Type,omitempty"`
+	// Types that are assignable to TypedValue:
+	//
+	//	*ColumnValue_StringValue
+	//	*ColumnValue_Uint32Value
+	//	*ColumnValue_Uint64Value
+	//	*ColumnValue_Float64Value
+	//	*ColumnValue_BoolValue
+	TypedValue isColumnValue_TypedValue `protobuf_oneof:"TypedValue"`
+}
+
+func (x *ColumnValue) Reset() {
+	*x = ColumnValue{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v1_request_command_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ColumnValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ColumnValue) ProtoMessage() {}
+
+func (x *ColumnValue) ProtoReflect() protoreflect.Message {
+	mi := &file_v1_request_command_proto_msgTypes[16]
+	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 ColumnValue.ProtoReflect.Descriptor instead.
+func (*ColumnValue) Descriptor() ([]byte, []int) {
+	return file_v1_request_command_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ColumnValue) GetKind() int32 {
+	if x != nil {
+		return x.Kind
+	}
+	return 0
+}
+
+func (x *ColumnValue) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (m *ColumnValue) GetTypedValue() isColumnValue_TypedValue {
+	if m != nil {
+		return m.TypedValue
+	}
+	return nil
+}
+
+func (x *ColumnValue) GetStringValue() string {
+	if x, ok := x.GetTypedValue().(*ColumnValue_StringValue); ok {
+		return x.StringValue
+	}
+	return ""
+}
+
+func (x *ColumnValue) GetUint32Value() uint32 {
+	if x, ok := x.GetTypedValue().(*ColumnValue_Uint32Value); ok {
+		return x.Uint32Value
+	}
+	return 0
+}
+
+func (x *ColumnValue) GetUint64Value() uint64 {
+	if x, ok := x.GetTypedValue().(*ColumnValue_Uint64Value); ok {
+		return x.Uint64Value
+	}
+	return 0
+}
+
+func (x *ColumnValue) GetFloat64Value() float64 {
+	if x, ok := x.GetTypedValue().(*ColumnValue_Float64Value); ok {
+		return x.Float64Value
+	}
+	return 0
+}
+
+func (x *ColumnValue) GetBoolValue() bool {
+	if x, ok := x.GetTypedValue().(*ColumnValue_BoolValue); ok {
+		return x.BoolValue
+	}
+	return false
+}
+
+type isColumnValue_TypedValue interface {
+	isColumnValue_TypedValue()
+}
+
+type ColumnValue_StringValue struct {
+	StringValue string `protobuf:"bytes,3,opt,name=StringValue,proto3,oneof"`
+}
+
+type ColumnValue_Uint32Value struct {
+	Uint32Value uint32 `protobuf:"varint,4,opt,name=Uint32Value,proto3,oneof"`
+}
+
+type ColumnValue_Uint64Value struct {
+	Uint64Value uint64 `protobuf:"varint,5,opt,name=Uint64Value,proto3,oneof"`
+}
+
+type ColumnValue_Float64Value struct {
+	Float64Value float64 `protobuf:"fixed64,6,opt,name=Float64Value,proto3,oneof"`
+}
+
+type ColumnValue_BoolValue struct {
+	BoolValue bool `protobuf:"varint,7,opt,name=BoolValue,proto3,oneof"`
+}
+
+func (*ColumnValue_StringValue) isColumnValue_TypedValue() {}
+
+func (*ColumnValue_Uint32Value) isColumnValue_TypedValue() {}
+
+func (*ColumnValue_Uint64Value) isColumnValue_TypedValue() {}
+
+func (*ColumnValue_Float64Value) isColumnValue_TypedValue() {}
+
+func (*ColumnValue_BoolValue) isColumnValue_TypedValue() {}
+
 var File_v1_request_command_proto protoreflect.FileDescriptor
 
 var file_v1_request_command_proto_rawDesc = []byte{
@@ -1071,7 +1312,7 @@ var file_v1_request_command_proto_rawDesc = []byte{
 	0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61,
 	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42,
-	0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xef, 0x01, 0x0a, 0x0d, 0x49,
+	0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8e, 0x02, 0x0a, 0x0d, 0x49,
 	0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a,
 	0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
 	0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61,
@@ -1081,72 +1322,41 @@ var file_v1_request_command_proto_rawDesc = []byte{
 	0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65,
 	0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
 	0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72,
-	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01,
-	0x28, 0x0c, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x04, 0x4b, 0x65, 0x79, 0x73,
-	0x12, 0x22, 0x0a, 0x08, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01,
-	0x28, 0x0c, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x08, 0x54, 0x61, 0x62, 0x6c,
-	0x65, 0x52, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x8c, 0x01, 0x0a,
-	0x12, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49,
-	0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52,
-	0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x36, 0x0a, 0x05, 0x49,
-	0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65,
-	0x49, 0x74, 0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05, 0x49, 0x74,
-	0x65, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0xa4, 0x01, 0x0a, 0x0f,
-	0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12,
-	0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69,
-	0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06,
-	0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65,
-	0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a,
-	0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06,
-	0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
-	0x31, 0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13,
-	0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x49,
-	0x74, 0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05, 0x49, 0x74, 0x65,
-	0x6d, 0x73, 0x22, 0x4c, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d,
-	0x12, 0x1a, 0x0a, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06,
-	0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x22, 0x0a, 0x08,
-	0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06,
-	0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x08, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77,
-	0x22, 0xcb, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6c, 0x75, 0x6d,
+	0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00,
+	0x52, 0x0a, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08,
+	0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11,
+	0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f,
+	0x77, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x08, 0x54, 0x61, 0x62, 0x6c, 0x65,
+	0x52, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x8c, 0x01, 0x0a, 0x12,
+	0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65,
 	0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44,
 	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a,
-	0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61,
-	0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68,
-	0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58,
-	0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69,
-	0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73,
-	0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58,
-	0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x04, 0x4b, 0x65,
-	0x79, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00,
-	0x52, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x8c,
-	0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73,
-	0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58,
-	0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x36, 0x0a,
-	0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62,
-	0x6c, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05,
-	0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0xa4, 0x01,
-	0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x74, 0x65,
-	0x6d, 0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78,
-	0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50,
-	0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12,
-	0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
-	0x6e, 0x12, 0x31, 0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x13, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05, 0x49,
-	0x74, 0x65, 0x6d, 0x73, 0x22, 0x28, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74,
-	0x65, 0x6d, 0x12, 0x1a, 0x0a, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c,
-	0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xf5,
-	0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x36, 0x0a, 0x05, 0x49, 0x74,
+	0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49,
+	0x74, 0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05, 0x49, 0x74, 0x65,
+	0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0xa4, 0x01, 0x0a, 0x0f, 0x49,
+	0x6e, 0x73, 0x65, 0x72, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x3c,
+	0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74,
+	0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2,
+	0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66,
+	0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07,
+	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2,
+	0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31,
+	0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e,
+	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x49, 0x74,
+	0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05, 0x49, 0x74, 0x65, 0x6d,
+	0x73, 0x22, 0x6b, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12,
+	0x26, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x0a, 0x4b, 0x65, 0x79,
+	0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x54, 0x61, 0x62, 0x6c, 0x65,
+	0x52, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x42, 0x06, 0xe2, 0xdf,
+	0x1f, 0x02, 0x70, 0x00, 0x52, 0x08, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x22, 0xba,
+	0x02, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 	0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61,
 	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c,
@@ -1155,34 +1365,121 @@ var file_v1_request_command_proto_rawDesc = []byte{
 	0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68,
 	0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
 	0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52,
-	0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x04, 0x4b, 0x65, 0x79, 0x73,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x04,
-	0x4b, 0x65, 0x79, 0x73, 0x12, 0x28, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65,
-	0x52, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70,
-	0x00, 0x52, 0x0b, 0x4e, 0x65, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x12, 0x16,
-	0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0xcb, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x61,
-	0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61,
-	0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf,
-	0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44,
-	0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57,
-	0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,
-	0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72,
-	0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20,
-	0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42,
-	0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-	0x12, 0x1a, 0x0a, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06,
-	0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06,
-	0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73,
-	0x65, 0x72, 0x49, 0x44, 0x22, 0x41, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74,
-	0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x22, 0x17, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73,
-	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x42, 0x20, 0x5a, 0x1e, 0x64, 0x70, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63,
-	0x5f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x20, 0x00, 0x52, 0x09, 0x4b, 0x65, 0x79, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x3c, 0x0a,
+	0x0e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8c, 0x01, 0x0a, 0x12,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a,
+	0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x36, 0x0a, 0x05, 0x49, 0x74,
+	0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49,
+	0x74, 0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05, 0x49, 0x74, 0x65,
+	0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0xa4, 0x01, 0x0a, 0x0f, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x3c,
+	0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74,
+	0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2,
+	0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66,
+	0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07,
+	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2,
+	0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31,
+	0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e,
+	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74,
+	0x65, 0x6d, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x60, 0x01, 0x52, 0x05, 0x49, 0x74, 0x65, 0x6d,
+	0x73, 0x22, 0x94, 0x01, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d,
+	0x12, 0x48, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x20, 0x00, 0x52,
+	0x09, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x4b, 0x65,
+	0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
+	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,
+	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf7, 0x02, 0x0a, 0x0d, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06,
+	0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
+	0x49, 0x44, 0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69,
+	0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65,
+	0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61,
+	0x12, 0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69,
+	0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18,
+	0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4b, 0x65,
+	0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x06, 0xe2, 0xdf,
+	0x1f, 0x02, 0x20, 0x00, 0x52, 0x09, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12,
+	0x3b, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54,
+	0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x70, 0x00, 0x52,
+	0x0b, 0x4e, 0x65, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x44, 0x1a, 0x3c, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+	0x38, 0x01, 0x22, 0xba, 0x02, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
+	0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01,
+	0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x3c, 0x0a, 0x15,
+	0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53,
+	0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f,
+	0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78,
+	0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07, 0x56, 0x65,
+	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f,
+	0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x09,
+	0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x25, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x79,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x20, 0x00, 0x52, 0x09,
+	0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x1a, 0x3c, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e,
+	0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
+	0x41, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x65,
+	0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06,
+	0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
+	0x49, 0x44, 0x22, 0x17, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x45, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x35, 0x0a, 0x08, 0x54,
+	0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x12, 0x29, 0x0a, 0x07, 0x43, 0x6f, 0x6c, 0x75, 0x6d,
+	0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x43, 0x6f, 0x6c, 0x75, 0x6d,
+	0x6e, 0x73, 0x22, 0x48, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04,
+	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x2a, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x14, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xf5, 0x01, 0x0a,
+	0x0b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04,
+	0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64,
+	0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x53, 0x74, 0x72,
+	0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0b, 0x55, 0x69, 0x6e, 0x74,
+	0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52,
+	0x0b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0b,
+	0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x04, 0x48, 0x00, 0x52, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x12, 0x24, 0x0a, 0x0c, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0c, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x36,
+	0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x42, 0x6f, 0x6f,
+	0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x20, 0x5a, 0x1e, 0x64, 0x70, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x72,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1197,7 +1494,7 @@ func file_v1_request_command_proto_rawDescGZIP() []byte {
 	return file_v1_request_command_proto_rawDescData
 }
 
-var file_v1_request_command_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
+var file_v1_request_command_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
 var file_v1_request_command_proto_goTypes = []interface{}{
 	(*AutoMigrateRequest)(nil),      // 0: request.AutoMigrateRequest
 	(*TransactionOperation)(nil),    // 1: request.TransactionOperation
@@ -1213,6 +1510,13 @@ var file_v1_request_command_proto_goTypes = []interface{}{
 	(*ReplayRequest)(nil),           // 11: request.ReplayRequest
 	(*TransactionBeginRequest)(nil), // 12: request.TransactionBeginRequest
 	(*TransactionEndRequest)(nil),   // 13: request.TransactionEndRequest
+	(*TableRow)(nil),                // 14: request.TableRow
+	(*Column)(nil),                  // 15: request.Column
+	(*ColumnValue)(nil),             // 16: request.ColumnValue
+	nil,                             // 17: request.DeleteRequest.KeyValuesEntry
+	nil,                             // 18: request.DeleteItem.KeyValuesEntry
+	nil,                             // 19: request.UpdateRequest.KeyValuesEntry
+	nil,                             // 20: request.ReplayRequest.KeyValuesEntry
 }
 var file_v1_request_command_proto_depIdxs = []int32{
 	12, // 0: request.TransactionOperation.TransactionBeginRequest:type_name -> request.TransactionBeginRequest
@@ -1222,15 +1526,24 @@ var file_v1_request_command_proto_depIdxs = []int32{
 	7,  // 4: request.TransactionOperation.DeleteBatchRequest:type_name -> request.DeleteBatchRequest
 	10, // 5: request.TransactionOperation.UpdateRequest:type_name -> request.UpdateRequest
 	13, // 6: request.TransactionOperation.TransactionEndRequest:type_name -> request.TransactionEndRequest
-	4,  // 7: request.InsertBatchRequest.Items:type_name -> request.InsertTableItem
-	5,  // 8: request.InsertTableItem.Items:type_name -> request.InsertItem
-	8,  // 9: request.DeleteBatchRequest.Items:type_name -> request.DeleteTableItem
-	9,  // 10: request.DeleteTableItem.Items:type_name -> request.DeleteItem
-	11, // [11:11] is the sub-list for method output_type
-	11, // [11:11] is the sub-list for method input_type
-	11, // [11:11] is the sub-list for extension type_name
-	11, // [11:11] is the sub-list for extension extendee
-	0,  // [0:11] is the sub-list for field type_name
+	14, // 7: request.InsertRequest.TableRow:type_name -> request.TableRow
+	4,  // 8: request.InsertBatchRequest.Items:type_name -> request.InsertTableItem
+	5,  // 9: request.InsertTableItem.Items:type_name -> request.InsertItem
+	14, // 10: request.InsertItem.TableRow:type_name -> request.TableRow
+	17, // 11: request.DeleteRequest.KeyValues:type_name -> request.DeleteRequest.KeyValuesEntry
+	8,  // 12: request.DeleteBatchRequest.Items:type_name -> request.DeleteTableItem
+	9,  // 13: request.DeleteTableItem.Items:type_name -> request.DeleteItem
+	18, // 14: request.DeleteItem.KeyValues:type_name -> request.DeleteItem.KeyValuesEntry
+	19, // 15: request.UpdateRequest.KeyValues:type_name -> request.UpdateRequest.KeyValuesEntry
+	14, // 16: request.UpdateRequest.NewTableRow:type_name -> request.TableRow
+	20, // 17: request.ReplayRequest.KeyValues:type_name -> request.ReplayRequest.KeyValuesEntry
+	15, // 18: request.TableRow.Columns:type_name -> request.Column
+	16, // 19: request.Column.Value:type_name -> request.ColumnValue
+	20, // [20:20] is the sub-list for method output_type
+	20, // [20:20] is the sub-list for method input_type
+	20, // [20:20] is the sub-list for extension type_name
+	20, // [20:20] is the sub-list for extension extendee
+	0,  // [0:20] is the sub-list for field type_name
 }
 
 func init() { file_v1_request_command_proto_init() }
@@ -1407,6 +1720,42 @@ func file_v1_request_command_proto_init() {
 				return nil
 			}
 		}
+		file_v1_request_command_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TableRow); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v1_request_command_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Column); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v1_request_command_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ColumnValue); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	file_v1_request_command_proto_msgTypes[1].OneofWrappers = []interface{}{
 		(*TransactionOperation_TransactionBeginRequest)(nil),
@@ -1417,13 +1766,20 @@ func file_v1_request_command_proto_init() {
 		(*TransactionOperation_UpdateRequest)(nil),
 		(*TransactionOperation_TransactionEndRequest)(nil),
 	}
+	file_v1_request_command_proto_msgTypes[16].OneofWrappers = []interface{}{
+		(*ColumnValue_StringValue)(nil),
+		(*ColumnValue_Uint32Value)(nil),
+		(*ColumnValue_Uint64Value)(nil),
+		(*ColumnValue_Float64Value)(nil),
+		(*ColumnValue_BoolValue)(nil),
+	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_v1_request_command_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   14,
+			NumMessages:   21,
 			NumExtensions: 0,
 			NumServices:   0,
 		},

+ 45 - 22
pb/v1/request/command.validator.pb.go

@@ -93,11 +93,15 @@ func (this *InsertRequest) Validate() error {
 	if this.Version == "" {
 		return github_com_mwitkow_go_proto_validators.FieldError("Version", fmt.Errorf(`value '%v' must not be an empty string`, this.Version))
 	}
-	if !(len(this.Keys) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("Keys", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.Keys))
+	for _, item := range this.KeyColumns {
+		if !(len(item) > 0) {
+			return github_com_mwitkow_go_proto_validators.FieldError("KeyColumns", fmt.Errorf(`value '%v' must have a length greater than '0'`, item))
+		}
 	}
-	if !(len(this.TableRow) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("TableRow", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.TableRow))
+	if this.TableRow != nil {
+		if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.TableRow); err != nil {
+			return github_com_mwitkow_go_proto_validators.FieldError("TableRow", err)
+		}
 	}
 	return nil
 }
@@ -137,11 +141,15 @@ func (this *InsertTableItem) Validate() error {
 	return nil
 }
 func (this *InsertItem) Validate() error {
-	if !(len(this.Keys) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("Keys", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.Keys))
+	for _, item := range this.KeyColumns {
+		if !(len(item) > 0) {
+			return github_com_mwitkow_go_proto_validators.FieldError("KeyColumns", fmt.Errorf(`value '%v' must have a length greater than '0'`, item))
+		}
 	}
-	if !(len(this.TableRow) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("TableRow", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.TableRow))
+	if this.TableRow != nil {
+		if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.TableRow); err != nil {
+			return github_com_mwitkow_go_proto_validators.FieldError("TableRow", err)
+		}
 	}
 	return nil
 }
@@ -155,9 +163,7 @@ func (this *DeleteRequest) Validate() error {
 	if this.Version == "" {
 		return github_com_mwitkow_go_proto_validators.FieldError("Version", fmt.Errorf(`value '%v' must not be an empty string`, this.Version))
 	}
-	if !(len(this.Keys) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("Keys", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.Keys))
-	}
+	// Validation of proto3 map<> fields is unsupported.
 	return nil
 }
 func (this *DeleteBatchRequest) Validate() error {
@@ -196,9 +202,7 @@ func (this *DeleteTableItem) Validate() error {
 	return nil
 }
 func (this *DeleteItem) Validate() error {
-	if !(len(this.Keys) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("Keys", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.Keys))
-	}
+	// Validation of proto3 map<> fields is unsupported.
 	return nil
 }
 func (this *UpdateRequest) Validate() error {
@@ -211,11 +215,11 @@ func (this *UpdateRequest) Validate() error {
 	if this.Version == "" {
 		return github_com_mwitkow_go_proto_validators.FieldError("Version", fmt.Errorf(`value '%v' must not be an empty string`, this.Version))
 	}
-	if !(len(this.Keys) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("Keys", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.Keys))
-	}
-	if !(len(this.NewTableRow) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("NewTableRow", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.NewTableRow))
+	// Validation of proto3 map<> fields is unsupported.
+	if this.NewTableRow != nil {
+		if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.NewTableRow); err != nil {
+			return github_com_mwitkow_go_proto_validators.FieldError("NewTableRow", err)
+		}
 	}
 	return nil
 }
@@ -229,9 +233,7 @@ func (this *ReplayRequest) Validate() error {
 	if this.Version == "" {
 		return github_com_mwitkow_go_proto_validators.FieldError("Version", fmt.Errorf(`value '%v' must not be an empty string`, this.Version))
 	}
-	if !(len(this.Keys) > 0) {
-		return github_com_mwitkow_go_proto_validators.FieldError("Keys", fmt.Errorf(`value '%v' must have a length greater than '0'`, this.Keys))
-	}
+	// Validation of proto3 map<> fields is unsupported.
 	return nil
 }
 func (this *TransactionBeginRequest) Validate() error {
@@ -243,3 +245,24 @@ func (this *TransactionBeginRequest) Validate() error {
 func (this *TransactionEndRequest) Validate() error {
 	return nil
 }
+func (this *TableRow) Validate() error {
+	for _, item := range this.Columns {
+		if item != nil {
+			if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
+				return github_com_mwitkow_go_proto_validators.FieldError("Columns", err)
+			}
+		}
+	}
+	return nil
+}
+func (this *Column) Validate() error {
+	if this.Value != nil {
+		if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.Value); err != nil {
+			return github_com_mwitkow_go_proto_validators.FieldError("Value", err)
+		}
+	}
+	return nil
+}
+func (this *ColumnValue) Validate() error {
+	return nil
+}

+ 70 - 193
pb/v1/request/query.pb.go

@@ -264,12 +264,11 @@ type QueryByKeysRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	DatabaseID            string `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
-	TablePrefixWithSchema string `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
-	Version               string `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
-	Select                string `protobuf:"bytes,4,opt,name=Select,proto3" json:"Select,omitempty"`
-	Keys                  []byte `protobuf:"bytes,5,opt,name=Keys,proto3" json:"Keys,omitempty"`
-	Where                 []byte `protobuf:"bytes,6,opt,name=Where,proto3" json:"Where,omitempty"`
+	DatabaseID            string            `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
+	TablePrefixWithSchema string            `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
+	Version               string            `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
+	Select                string            `protobuf:"bytes,4,opt,name=Select,proto3" json:"Select,omitempty"`
+	KeyValues             map[string]string `protobuf:"bytes,5,rep,name=KeyValues,proto3" json:"KeyValues,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 }
 
 func (x *QueryByKeysRequest) Reset() {
@@ -332,111 +331,9 @@ func (x *QueryByKeysRequest) GetSelect() string {
 	return ""
 }
 
-func (x *QueryByKeysRequest) GetKeys() []byte {
-	if x != nil {
-		return x.Keys
-	}
-	return nil
-}
-
-func (x *QueryByKeysRequest) GetWhere() []byte {
+func (x *QueryByKeysRequest) GetKeyValues() map[string]string {
 	if x != nil {
-		return x.Where
-	}
-	return nil
-}
-
-type CommonQueryByKeysRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	DatabaseID            string `protobuf:"bytes,1,opt,name=DatabaseID,proto3" json:"DatabaseID,omitempty"`
-	TablePrefixWithSchema string `protobuf:"bytes,2,opt,name=TablePrefixWithSchema,proto3" json:"TablePrefixWithSchema,omitempty"`
-	Version               string `protobuf:"bytes,3,opt,name=Version,proto3" json:"Version,omitempty"`
-	Select                string `protobuf:"bytes,4,opt,name=Select,proto3" json:"Select,omitempty"`
-	Keys                  []byte `protobuf:"bytes,5,opt,name=Keys,proto3" json:"Keys,omitempty"`
-	Where                 []byte `protobuf:"bytes,6,opt,name=Where,proto3" json:"Where,omitempty"`
-	Or                    []byte `protobuf:"bytes,7,opt,name=Or,proto3" json:"Or,omitempty"`
-}
-
-func (x *CommonQueryByKeysRequest) Reset() {
-	*x = CommonQueryByKeysRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_v1_request_query_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *CommonQueryByKeysRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*CommonQueryByKeysRequest) ProtoMessage() {}
-
-func (x *CommonQueryByKeysRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_v1_request_query_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use CommonQueryByKeysRequest.ProtoReflect.Descriptor instead.
-func (*CommonQueryByKeysRequest) Descriptor() ([]byte, []int) {
-	return file_v1_request_query_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *CommonQueryByKeysRequest) GetDatabaseID() string {
-	if x != nil {
-		return x.DatabaseID
-	}
-	return ""
-}
-
-func (x *CommonQueryByKeysRequest) GetTablePrefixWithSchema() string {
-	if x != nil {
-		return x.TablePrefixWithSchema
-	}
-	return ""
-}
-
-func (x *CommonQueryByKeysRequest) GetVersion() string {
-	if x != nil {
-		return x.Version
-	}
-	return ""
-}
-
-func (x *CommonQueryByKeysRequest) GetSelect() string {
-	if x != nil {
-		return x.Select
-	}
-	return ""
-}
-
-func (x *CommonQueryByKeysRequest) GetKeys() []byte {
-	if x != nil {
-		return x.Keys
-	}
-	return nil
-}
-
-func (x *CommonQueryByKeysRequest) GetWhere() []byte {
-	if x != nil {
-		return x.Where
-	}
-	return nil
-}
-
-func (x *CommonQueryByKeysRequest) GetOr() []byte {
-	if x != nil {
-		return x.Or
+		return x.KeyValues
 	}
 	return nil
 }
@@ -457,7 +354,7 @@ type CountWhereRequest struct {
 func (x *CountWhereRequest) Reset() {
 	*x = CountWhereRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v1_request_query_proto_msgTypes[4]
+		mi := &file_v1_request_query_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -470,7 +367,7 @@ func (x *CountWhereRequest) String() string {
 func (*CountWhereRequest) ProtoMessage() {}
 
 func (x *CountWhereRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_v1_request_query_proto_msgTypes[4]
+	mi := &file_v1_request_query_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -483,7 +380,7 @@ func (x *CountWhereRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CountWhereRequest.ProtoReflect.Descriptor instead.
 func (*CountWhereRequest) Descriptor() ([]byte, []int) {
-	return file_v1_request_query_proto_rawDescGZIP(), []int{4}
+	return file_v1_request_query_proto_rawDescGZIP(), []int{3}
 }
 
 func (x *CountWhereRequest) GetDatabaseID() string {
@@ -548,7 +445,7 @@ type CommonCountRequest struct {
 func (x *CommonCountRequest) Reset() {
 	*x = CommonCountRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v1_request_query_proto_msgTypes[5]
+		mi := &file_v1_request_query_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -561,7 +458,7 @@ func (x *CommonCountRequest) String() string {
 func (*CommonCountRequest) ProtoMessage() {}
 
 func (x *CommonCountRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_v1_request_query_proto_msgTypes[5]
+	mi := &file_v1_request_query_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -574,7 +471,7 @@ func (x *CommonCountRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CommonCountRequest.ProtoReflect.Descriptor instead.
 func (*CommonCountRequest) Descriptor() ([]byte, []int) {
-	return file_v1_request_query_proto_rawDescGZIP(), []int{5}
+	return file_v1_request_query_proto_rawDescGZIP(), []int{4}
 }
 
 func (x *CommonCountRequest) GetDatabaseID() string {
@@ -697,7 +594,7 @@ var file_v1_request_query_proto_rawDesc = []byte{
 	0x50, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x50, 0x61,
 	0x67, 0x65, 0x4e, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
 	0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
-	0x22, 0xde, 0x01, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73,
+	0x22, 0xc4, 0x02, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73,
 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62,
 	0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f,
 	0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12,
@@ -708,62 +605,53 @@ var file_v1_request_query_proto_rawDesc = []byte{
 	0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06,
 	0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
 	0x16, 0x0a, 0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x57,
-	0x68, 0x65, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x57, 0x68, 0x65, 0x72,
-	0x65, 0x22, 0xf4, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72,
-	0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26,
-	0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61,
-	0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50,
-	0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54,
-	0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63,
-	0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56,
-	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x12,
-	0x0a, 0x04, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x4b, 0x65,
-	0x79, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
-	0x0c, 0x52, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x72, 0x18, 0x07,
-	0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x4f, 0x72, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x75,
-	0x6e, 0x74, 0x57, 0x68, 0x65, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26,
-	0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61,
-	0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50,
-	0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54,
-	0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63,
-	0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56,
-	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x06,
-	0x50, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x50, 0x61,
-	0x67, 0x65, 0x4e, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
-	0x22, 0xbc, 0x02, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62,
-	0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f,
-	0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12,
-	0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69,
-	0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06,
-	0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65,
-	0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a,
-	0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06,
-	0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
-	0x14, 0x0a, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05,
-	0x57, 0x68, 0x65, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28,
-	0x0c, 0x52, 0x02, 0x4f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79,
-	0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x12,
-	0x12, 0x0a, 0x04, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4a,
-	0x6f, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20,
-	0x01, 0x28, 0x0c, 0x52, 0x06, 0x48, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x50,
-	0x61, 0x67, 0x65, 0x4e, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x50, 0x61, 0x67,
+	0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x50, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x20, 0x00, 0x52, 0x09,
+	0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x4b, 0x65, 0x79,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x75, 0x6e,
+	0x74, 0x57, 0x68, 0x65, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a,
+	0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x3c, 0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72,
+	0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61,
+	0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68,
+	0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65,
+	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50,
+	0x61, 0x67, 0x65, 0x4e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x50, 0x61, 0x67,
 	0x65, 0x4e, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18,
-	0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x42,
-	0x20, 0x5a, 0x1e, 0x64, 0x70, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f,
-	0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22,
+	0xbc, 0x02, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02,
+	0x58, 0x01, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x44, 0x12, 0x3c,
+	0x0a, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x57, 0x69, 0x74,
+	0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2,
+	0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x15, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66,
+	0x69, 0x78, 0x57, 0x69, 0x74, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x07,
+	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2,
+	0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14,
+	0x0a, 0x05, 0x57, 0x68, 0x65, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x57,
+	0x68, 0x65, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x02, 0x4f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x18,
+	0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x12, 0x12,
+	0x0a, 0x04, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4a, 0x6f,
+	0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01,
+	0x28, 0x0c, 0x52, 0x06, 0x48, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61,
+	0x67, 0x65, 0x4e, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x50, 0x61, 0x67, 0x65,
+	0x4e, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x20,
+	0x5a, 0x1e, 0x64, 0x70, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61,
+	0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -783,16 +671,17 @@ var file_v1_request_query_proto_goTypes = []interface{}{
 	(*QueryByWhereAndOrderByRequest)(nil), // 0: request.QueryByWhereAndOrderByRequest
 	(*CommonQueryRequest)(nil),            // 1: request.CommonQueryRequest
 	(*QueryByKeysRequest)(nil),            // 2: request.QueryByKeysRequest
-	(*CommonQueryByKeysRequest)(nil),      // 3: request.CommonQueryByKeysRequest
-	(*CountWhereRequest)(nil),             // 4: request.CountWhereRequest
-	(*CommonCountRequest)(nil),            // 5: request.CommonCountRequest
+	(*CountWhereRequest)(nil),             // 3: request.CountWhereRequest
+	(*CommonCountRequest)(nil),            // 4: request.CommonCountRequest
+	nil,                                   // 5: request.QueryByKeysRequest.KeyValuesEntry
 }
 var file_v1_request_query_proto_depIdxs = []int32{
-	0, // [0:0] is the sub-list for method output_type
-	0, // [0:0] is the sub-list for method input_type
-	0, // [0:0] is the sub-list for extension type_name
-	0, // [0:0] is the sub-list for extension extendee
-	0, // [0:0] is the sub-list for field type_name
+	5, // 0: request.QueryByKeysRequest.KeyValues:type_name -> request.QueryByKeysRequest.KeyValuesEntry
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
 func init() { file_v1_request_query_proto_init() }
@@ -838,18 +727,6 @@ func file_v1_request_query_proto_init() {
 			}
 		}
 		file_v1_request_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CommonQueryByKeysRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_v1_request_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CountWhereRequest); i {
 			case 0:
 				return &v.state
@@ -861,7 +738,7 @@ func file_v1_request_query_proto_init() {
 				return nil
 			}
 		}
-		file_v1_request_query_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+		file_v1_request_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CommonCountRequest); i {
 			case 0:
 				return &v.state

+ 1 - 12
pb/v1/request/query.validator.pb.go

@@ -50,18 +50,7 @@ func (this *QueryByKeysRequest) Validate() error {
 	if this.Version == "" {
 		return github_com_mwitkow_go_proto_validators.FieldError("Version", fmt.Errorf(`value '%v' must not be an empty string`, this.Version))
 	}
-	return nil
-}
-func (this *CommonQueryByKeysRequest) Validate() error {
-	if this.DatabaseID == "" {
-		return github_com_mwitkow_go_proto_validators.FieldError("DatabaseID", fmt.Errorf(`value '%v' must not be an empty string`, this.DatabaseID))
-	}
-	if this.TablePrefixWithSchema == "" {
-		return github_com_mwitkow_go_proto_validators.FieldError("TablePrefixWithSchema", fmt.Errorf(`value '%v' must not be an empty string`, this.TablePrefixWithSchema))
-	}
-	if this.Version == "" {
-		return github_com_mwitkow_go_proto_validators.FieldError("Version", fmt.Errorf(`value '%v' must not be an empty string`, this.Version))
-	}
+	// Validation of proto3 map<> fields is unsupported.
 	return nil
 }
 func (this *CountWhereRequest) Validate() error {

+ 0 - 1
ports/client.go

@@ -8,7 +8,6 @@ type Client interface {
 	QueryByWhereAndOrderBy(request *QueryByWhereAndOrderByRequest) (string, []map[string]any, int64, error)
 	CommonQuery(request *CommonQueryRequest) (string, []map[string]any, int64, error)
 	QueryByKeys(request *QueryByKeysRequest) (string, map[string]any, error)
-	CommonQueryByKeys(request *CommonQueryByKeysRequest) (string, map[string]any, error)
 	CountWhere(request *CountWhereRequest) (string, int64, error)
 	CommonCount(request *CommonCountRequest) (string, int64, error)
 }

+ 8 - 8
ports/client_cmd_request.go

@@ -13,7 +13,7 @@ type InsertRequest struct {
 	DatabaseID            string
 	TablePrefixWithSchema string
 	Version               string
-	Keys                  []Key
+	KeyColumns            []string
 	TableRow              map[string]any
 	UserID                string
 }
@@ -31,15 +31,15 @@ type InsertTableItem struct {
 }
 
 type InsertItem struct {
-	Keys     []Key
-	TableRow map[string]any
+	KeyColumns []string
+	TableRow   map[string]any
 }
 
 type DeleteRequest struct {
 	DatabaseID            string
 	TablePrefixWithSchema string
 	Version               string
-	Keys                  []Key
+	KeyValues             map[string]string
 	UserID                string
 }
 
@@ -56,15 +56,15 @@ type DeleteTableItem struct {
 }
 
 type DeleteItem struct {
-	Keys []Key
+	KeyValues map[string]string
 }
 
 type UpdateRequest struct {
 	DatabaseID            string
 	TablePrefixWithSchema string
 	Version               string
-	Keys                  []Key
-	NewTableRow           []map[string]any
+	KeyValues             map[string]string
+	NewTableRow           map[string]any
 	UserID                string
 }
 
@@ -72,7 +72,7 @@ type ReplayRequest struct {
 	DatabaseID            string
 	TablePrefixWithSchema string
 	Version               string
-	Keys                  []Key
+	KeyValues             map[string]string
 	UserID                string
 }
 

+ 1 - 12
ports/client_query_request.go

@@ -31,18 +31,7 @@ type QueryByKeysRequest struct {
 	TablePrefixWithSchema string
 	Version               string
 	Select                string
-	Keys                  []Key
-	Where                 []ColumnCompare
-}
-
-type CommonQueryByKeysRequest struct {
-	DatabaseID            string
-	TablePrefixWithSchema string
-	Version               string
-	Select                string
-	Keys                  []Key
-	Where                 []ColumnCompare
-	Or                    []ColumnCompare
+	KeyValues             map[string]string
 }
 
 type CountWhereRequest struct {

+ 0 - 5
ports/client_request_common.go

@@ -1,10 +1,5 @@
 package ports
 
-type Key struct {
-	Column string `json:"column"`
-	Value  string `json:"value"`
-}
-
 type ColumnCompare struct {
 	Column  string `json:"column"`
 	Value   any    `json:"value"`

+ 0 - 16
test/v1/sdk.go

@@ -114,22 +114,6 @@ func (toolKit *ToolKit) commonQuery(req *ports.CommonQueryRequest, retInfosMap *
 	return toolKit
 }
 
-func (toolKit *ToolKit) commonQueryByKeys(req *ports.CommonQueryByKeysRequest, retInfoMap *map[string]any) *ToolKit {
-	statement, infoMap, err := clientInstance.CommonQueryByKeys(req)
-	if err != nil {
-		toolKit.t.Fatal(err)
-	}
-
-	fmt.Println(statement)
-
-	if retInfoMap != nil {
-		*retInfoMap = make(map[string]any)
-		*retInfoMap = infoMap
-	}
-
-	return toolKit
-}
-
 func (toolKit *ToolKit) CountWhere(req *ports.CountWhereRequest, retCount *int64) *ToolKit {
 	statement, count, err := clientInstance.CountWhere(req)
 	if err != nil {

+ 1 - 3
test/v1/v1_test.go

@@ -48,9 +48,7 @@ func TestInsert(t *testing.T) {
 		DatabaseID:            "2b78141779ee432295ca371b91c5cac7",
 		TablePrefixWithSchema: tablePrefix,
 		Version:               "v1",
-		Keys: []ports.Key{
-			{"id", id},
-		},
+		KeyColumns:            []string{"id"},
 		TableRow: map[string]any{
 			"id":        id,
 			"name":      name,