private IMessage EncodeSearch(Request.OTSRequest request)
        {
            var requestReal = (Request.SearchRequest)request;
            var builder     = PB.SearchRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);
            builder.SetIndexName(requestReal.IndexName);
            builder.SetSearchQuery(EncodeSearchQuery(requestReal.SearchQuery).ToByteString());
            if (requestReal.ColumnsToGet != null)
            {
                builder.SetColumnsToGet(EncodeColumsToGet(requestReal.ColumnsToGet));
            }
            if (requestReal.RoutingValues != null)
            {
                List <ByteString> routingValues = new List <ByteString>();
                foreach (var pk in requestReal.RoutingValues)
                {
                    try
                    {
                        routingValues.Add(ByteString.CopyFrom(PlainBufferBuilder.BuildPrimaryKeyWithHeader(pk)));
                    }
                    catch (Exception e)
                    {
                        throw new OTSClientException("build plain buffer fail,msg:" + e.Message);
                    }
                }
                builder.AddRangeRoutingValues(routingValues);
            }

            return(builder.Build());
        }
        private IMessage EncodeGetRange(Request.OTSRequest request)
        {
            var requestReal = (Request.GetRangeRequest)request;
            var builder     = PB.GetRangeRequest.CreateBuilder();

            builder.SetTableName(requestReal.QueryCriteria.TableName);
            builder.SetDirection(MakeDirection(requestReal.QueryCriteria.Direction));

            if (requestReal.QueryCriteria.GetColumnsToGet() != null)
            {
                builder.AddRangeColumnsToGet(requestReal.QueryCriteria.GetColumnsToGet());
            }

            if (requestReal.QueryCriteria.Limit != null)
            {
                builder.SetLimit((int)requestReal.QueryCriteria.Limit);
            }

            if (requestReal.QueryCriteria.Filter != null)
            {
                builder.SetFilter(MakeColumnCondition(requestReal.QueryCriteria.Filter));
            }

            builder.AddRangeInclusiveStartPrimaryKey(
                MakeColumns(requestReal.QueryCriteria.InclusiveStartPrimaryKey));
            builder.AddRangeExclusiveEndPrimaryKey(
                MakeColumns(requestReal.QueryCriteria.ExclusiveEndPrimaryKey));

            return(builder.Build());
        }
        private IMessage EncodeCreateTable(Request.OTSRequest request)
        {
            var requestReal = (Request.CreateTableRequest)request;
            var builder     = PB.CreateTableRequest.CreateBuilder();

            builder.SetTableMeta(EncodeTableMeta(requestReal.TableMeta));
            builder.SetReservedThroughput(EncodeReservedThroughput(requestReal.ReservedThroughput));

            builder.SetTableOptions(EncodeTableOptions(requestReal.TableOptions));

            if (requestReal.StreamSpecification != null)
            {
                builder.SetStreamSpec(EncodeStreamSpecification(requestReal.StreamSpecification));
            }

            if (requestReal.PartitionRange != null)
            {
                for (var i = 0; i < requestReal.PartitionRange.Count; i++)
                {
                    builder.SetPartitions(i, EncodePartitionRange(requestReal.PartitionRange[i]));
                }
            }

            if (requestReal.IndexMetas != null)
            {
                for (int i = 0; i < requestReal.IndexMetas.Count; i++)
                {
                    builder.AddIndexMetas(EncodeIndexMeta(requestReal.IndexMetas[i]));
                }
            }

            var message = builder.Build();

            return(message);
        }
        private IMessage EncodeDescribeTable(Request.OTSRequest request)
        {
            var requestReal = (Request.DescribeTableRequest)request;
            var builder     = PB.DescribeTableRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);
            return(builder.Build());
        }
        private IMessage EncodeListSearchIndex(Request.OTSRequest request)
        {
            var requestReal = (Request.ListSearchIndexRequest)request;
            var builder     = PB.ListSearchIndexRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);
            return(builder.Build());
        }
        private IMessage EncodeUpdateTable(Request.OTSRequest request)
        {
            var requestReal = (Request.UpdateTableRequest)request;
            var builder     = PB.UpdateTableRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);
            builder.SetReservedThroughput(MakeReservedThroughput(requestReal.ReservedThroughput));
            return(builder.Build());
        }
        private IMessage EncodeGetRow(Request.OTSRequest request)
        {
            var requestReal   = (Request.GetRowRequest)request;
            var queryCriteria = requestReal.QueryCriteria;

            var builder = PB.GetRowRequest.CreateBuilder();

            builder.SetTableName(queryCriteria.TableName);
            builder.SetPrimaryKey(ByteString.CopyFrom(PB.PlainBufferBuilder.BuildPrimaryKeyWithHeader(queryCriteria.RowPrimaryKey)));

            builder.AddRangeColumnsToGet(queryCriteria.GetColumnsToGet());

            // if timeRange and maxVersions are both not set, set maxVersions to 1 default
            if (!CheckQueryCondition(queryCriteria.TableName, queryCriteria.MaxVersions, queryCriteria.TimeRange))
            {
                queryCriteria.MaxVersions = 1;
            }

            if (queryCriteria.TimeRange != null)
            {
                builder.SetTimeRange(EncodeTimeRange(queryCriteria.TimeRange));
            }

            if (queryCriteria.MaxVersions.HasValue)
            {
                builder.SetMaxVersions(queryCriteria.MaxVersions.Value);
            }

            if (queryCriteria.CacheBlocks != null && queryCriteria.CacheBlocks.HasValue)
            {
                builder.SetCacheBlocks(queryCriteria.CacheBlocks.Value);
            }

            if (queryCriteria.Filter != null)
            {
                builder.SetFilter(BuildFilter(queryCriteria.Filter));
            }

            if (queryCriteria.StartColumn != null)
            {
                builder.SetStartColumn(queryCriteria.StartColumn);
            }

            if (queryCriteria.EndColumn != null)
            {
                builder.SetEndColumn(queryCriteria.EndColumn);
            }

            if (queryCriteria.Token != null)
            {
                builder.SetToken(ByteString.CopyFrom(queryCriteria.Token));
            }


            return(builder.Build());
        }
        private IMessage EncodeCreateSearchIndex(Request.OTSRequest request)
        {
            var requestReal = (Request.CreateSearchIndexRequest)request;
            var builder     = PB.CreateSearchIndexRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);
            builder.SetIndexName(requestReal.IndexName);
            builder.SetSchema(EncodeIndexSchema(requestReal.IndexSchame));
            return(builder.Build());
        }
        private IMessage EncodeDeleteRow(Request.OTSRequest request)
        {
            var requestReal = (Request.DeleteRowRequest)request;
            var builder     = PB.DeleteRowRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);
            builder.SetCondition(MakeCondition(requestReal.Condition));
            builder.AddRangePrimaryKey(MakeColumns(requestReal.PrimaryKey));
            return(builder.Build());
        }
        public IMessage EncodeDeleteGlobalIndex(Request.OTSRequest request)
        {
            var requestReal = (Request.DeleteGlobalIndexRequest)request;
            var builder     = PB.DropIndexRequest.CreateBuilder();

            builder.SetMainTableName(requestReal.MainTableName);
            builder.SetIndexName(requestReal.IndexName);

            return(builder.Build());
        }
        private IMessage EncodePutRow(Request.OTSRequest request)
        {
            var requestReal = (Request.PutRowRequest)request;
            var builder     = PB.PutRowRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);
            builder.SetCondition(EncodeCondition(requestReal.Condition));
            builder.SetRow(ByteString.CopyFrom(PB.PlainBufferBuilder.BuildRowPutChangeWithHeader(requestReal.RowPutChange)));
            builder.SetReturnContent(EncodeReturnContent(requestReal.RowPutChange.ReturnType, requestReal.RowPutChange.ReturnColumnNames));
            return(builder.Build());
        }
        private IMessage EncodeCreateTable(Request.OTSRequest request)
        {
            var requestReal = (Request.CreateTableRequest)request;
            var builder     = PB.CreateTableRequest.CreateBuilder();

            builder.SetTableMeta(MakeTableMeta(requestReal.TableMeta));
            builder.SetReservedThroughput(MakeReservedThroughput(requestReal.ReservedThroughput));
            var message = builder.Build();

            return(message);
        }
        private IMessage EncodeCreateGlobalIndex(Request.OTSRequest request)
        {
            var requestReal = (Request.CreateGlobalIndexRequest)request;
            var builder     = PB.CreateIndexRequest.CreateBuilder();

            builder.SetMainTableName(requestReal.MainTableName);
            builder.SetIncludeBaseData(requestReal.IncludeBaseData);
            builder.SetIndexMeta(EncodeIndexMeta(requestReal.IndexMeta));

            return(builder.Build());
        }
        private IMessage EncodeBatchWriteRow(Request.OTSRequest request)
        {
            var requestReal = (Request.BatchWriteRowRequest)request;
            var builder     = PB.BatchWriteRowRequest.CreateBuilder();

            foreach (var item in requestReal.RowChangesGroupByTable)
            {
                builder.AddTables(EncodeTableInBatchWriteRowRequest(item.Key, item.Value));
            }

            return(builder.Build());
        }
        private IMessage EncodeBatchGetRow(Request.OTSRequest request)
        {
            var requestReal = (Request.BatchGetRowRequest)request;
            var builder     = PB.BatchGetRowRequest.CreateBuilder();

            foreach (var criterias in requestReal.GetCriterias())
            {
                builder.AddTables(EncodeTableInBatchGetRowRequest(criterias));
            }

            return(builder.Build());
        }
        private IMessage EncodeGetRow(Request.OTSRequest request)
        {
            var requestReal = (Request.GetRowRequest)request;
            var builder     = PB.GetRowRequest.CreateBuilder();

            builder.SetTableName(requestReal.QueryCriteria.TableName);
            builder.AddRangePrimaryKey(MakeColumns(requestReal.QueryCriteria.RowPrimaryKey));
            builder.AddRangeColumnsToGet(requestReal.QueryCriteria.GetColumnsToGet());
            if (requestReal.QueryCriteria.Filter != null)
            {
                builder.SetFilter(MakeColumnCondition(requestReal.QueryCriteria.Filter));
            }

            return(builder.Build());
        }
        private IMessage EncodeDeleteRow(Request.OTSRequest request)
        {
            var requestReal = (Request.DeleteRowRequest)request;
            var rowChange   = requestReal.RowDeleteChange;
            var builder     = PB.DeleteRowRequest.CreateBuilder();

            // required string table_name = 1;
            builder.SetTableName(rowChange.TableName);
            // required bytes primary_key = 2;
            builder.SetPrimaryKey(ByteString.CopyFrom(PB.PlainBufferBuilder.BuildRowDeleteChangeWithHeader(rowChange)));
            // required Condition condition = 3;
            builder.SetCondition(EncodeCondition(rowChange.Condition));
            // option ReturnType = 4;
            builder.SetReturnContent(EncodeReturnContent(rowChange.ReturnType, rowChange.ReturnColumnNames));
            return(builder.Build());
        }
        private IMessage EncodeUpdateTable(Request.OTSRequest request)
        {
            var requestReal = (Request.UpdateTableRequest)request;
            var builder     = PB.UpdateTableRequest.CreateBuilder();

            builder.SetTableName(requestReal.TableName);

            if (requestReal.ReservedThroughput != null)
            {
                builder.SetReservedThroughput(EncodeReservedThroughput(requestReal.ReservedThroughput));
            }

            if (requestReal.TableOptions != null)
            {
                builder.SetTableOptions(EncodeTableOptions(requestReal.TableOptions));
            }

            if (requestReal.StreamSpecification != null)
            {
                builder.SetStreamSpec(EncodeStreamSpecification(requestReal.StreamSpecification));
            }

            return(builder.Build());
        }
        private IMessage EncodeListTable(Request.OTSRequest request)
        {
            var builder = PB.ListTableRequest.CreateBuilder();

            return(builder.Build());
        }
        private IMessage EncodeGetRange(Request.OTSRequest request)
        {
            var requestReal = (Request.GetRangeRequest)request;
            var builder     = PB.GetRangeRequest.CreateBuilder();

            var queryCriteria = requestReal.QueryCriteria;

            // required string table_name = 1;
            builder.SetTableName(queryCriteria.TableName);

            // required Direction direction = 2;
            builder.SetDirection(ToPBDirection(queryCriteria.Direction));

            // repeated string columns_to_get = 3;
            if (queryCriteria.GetColumnsToGet() != null)
            {
                builder.AddRangeColumnsToGet(queryCriteria.GetColumnsToGet());
            }

            // if timeRange and maxVersions are both not set, set maxVersions to 1 default
            if (!CheckQueryCondition(queryCriteria.TableName, queryCriteria.MaxVersions, queryCriteria.TimeRange))
            {
                queryCriteria.MaxVersions = 1;
            }

            // optional TimeRange time_range = 4;
            if (queryCriteria.TimeRange != null)
            {
                builder.SetTimeRange(EncodeTimeRange(queryCriteria.TimeRange));
            }

            // optional int32 max_versions = 5;
            if (queryCriteria.MaxVersions.HasValue)
            {
                builder.SetMaxVersions(queryCriteria.MaxVersions.Value);
            }

            // optional int32 limit = 6;
            if (queryCriteria.Limit != null && queryCriteria.Limit > 0)
            {
                builder.SetLimit((int)queryCriteria.Limit);
            }

            // required bytes inclusive_start_primary_key = 7;
            builder.SetInclusiveStartPrimaryKey(ByteString.CopyFrom(PB.PlainBufferBuilder.BuildPrimaryKeyWithHeader(queryCriteria.InclusiveStartPrimaryKey)));
            // required bytes exclusive_end_primary_key = 8;
            builder.SetExclusiveEndPrimaryKey(ByteString.CopyFrom(PB.PlainBufferBuilder.BuildPrimaryKeyWithHeader(queryCriteria.ExclusiveEndPrimaryKey)));

            // optional bool cache_blocks = 9 [default = true];
            if (queryCriteria.CacheBlocks.HasValue)
            {
                builder.SetCacheBlocks(queryCriteria.CacheBlocks.Value);
            }

            // optional bytes filter = 10;
            if (queryCriteria.Filter != null)
            {
                builder.SetFilter(BuildFilter(queryCriteria.Filter));
            }

            // optional string start_column = 11;
            if (queryCriteria.StartColumn != null)
            {
                builder.SetStartColumn(queryCriteria.StartColumn);
            }

            // optional string end_column = 12;
            if (queryCriteria.EndColumn != null)
            {
                builder.SetEndColumn(queryCriteria.EndColumn);
            }

            // optional bytes token = 13;
            if (queryCriteria.HasSetToken())
            {
                builder.SetToken(ByteString.CopyFrom(queryCriteria.Token));
            }

            return(builder.Build());
        }