risingwave_common/
operator.rs

1// Copyright 2025 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 risingwave_common::id::{ActorId, FragmentId};
16use risingwave_pb::id::{ExecutorId, GlobalOperatorId, LocalOperatorId};
17
18/// Generate a globally unique operator id.
19pub fn unique_operator_id(
20    fragment_id: FragmentId,
21    operator_id: impl Into<LocalOperatorId>,
22) -> GlobalOperatorId {
23    (((fragment_id.as_raw_id() as u64) << 32) + operator_id.into().as_raw_id() as u64).into()
24}
25
26/// Generate a globally unique executor id.
27pub fn unique_executor_id(
28    actor_id: ActorId,
29    operator_id: impl Into<LocalOperatorId>,
30) -> ExecutorId {
31    (((actor_id.as_raw_id() as u64) << 32) + operator_id.into().as_raw_id() as u64).into()
32}
33
34/// Decompose a unique executor id into actor id and operator id.
35pub fn unique_executor_id_into_parts(unique_executor_id: ExecutorId) -> (ActorId, LocalOperatorId) {
36    let actor_id = (unique_executor_id.as_raw_id() >> 32) as u32;
37    let operator_id = (unique_executor_id.as_raw_id() & 0xFFFFFFFF) as u32;
38    (actor_id.into(), operator_id.into())
39}
40
41pub fn unique_operator_id_into_parts(
42    unique_operator_id: GlobalOperatorId,
43) -> (FragmentId, LocalOperatorId) {
44    let fragment_id = (unique_operator_id.as_raw_id() >> 32) as u32;
45    let operator_id = (unique_operator_id.as_raw_id() & 0xFFFFFFFF) as u32;
46    (fragment_id.into(), operator_id.into())
47}
48
49pub fn unique_executor_id_from_unique_operator_id(
50    actor_id: ActorId,
51    unique_operator_id: GlobalOperatorId,
52) -> ExecutorId {
53    let (_, operator_id) = unique_operator_id_into_parts(unique_operator_id);
54    unique_executor_id(actor_id, operator_id)
55}