risingwave_storage/row_serde/
row_serde_util.rs

1// Copyright 2022 RisingWave Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use bytes::{BufMut, Bytes, BytesMut};
16use risingwave_common::hash::VirtualNode;
17use risingwave_common::row::{OwnedRow, Row};
18use risingwave_common::util::row_serde::OrderedRowSerde;
19use risingwave_hummock_sdk::key::TableKey;
20
21pub fn serialize_row(row: impl Row, serializer: &OrderedRowSerde) -> Bytes {
22    let mut buf = BytesMut::with_capacity(row.len());
23    row.memcmp_serialize_into(serializer, &mut buf);
24    buf.freeze()
25}
26
27pub fn serialize_pk(pk: impl Row, serializer: &OrderedRowSerde) -> Bytes {
28    serialize_row(pk, serializer)
29}
30
31pub fn serialize_pk_with_vnode(
32    pk: impl Row,
33    serializer: &OrderedRowSerde,
34    vnode: VirtualNode,
35) -> TableKey<Bytes> {
36    let mut buffer = BytesMut::new();
37    buffer.put_slice(&vnode.to_be_bytes()[..]);
38    pk.memcmp_serialize_into(serializer, &mut buffer);
39    TableKey(buffer.freeze())
40}
41
42pub fn deserialize_pk_with_vnode(
43    key: &[u8],
44    deserializer: &OrderedRowSerde,
45) -> memcomparable::Result<(VirtualNode, OwnedRow)> {
46    let vnode = VirtualNode::from_be_bytes(key[0..VirtualNode::SIZE].try_into().unwrap());
47    let pk = deserializer.deserialize(&key[VirtualNode::SIZE..])?;
48    Ok((vnode, pk))
49}