Skip to content

Commit 32b3cbe

Browse files
committed
add rank by size optimization + bump sea-orm-cli
This commit adds the rank by size optimization into the embedded union-find data structure of the group sets. It also bumps the version number of `sea-orm-cli` to `1.1.2`.
1 parent 4d58221 commit 32b3cbe

File tree

10 files changed

+26
-16
lines changed

10 files changed

+26
-16
lines changed

optd-mvp/src/entities/fingerprint.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
use sea_orm::entity::prelude::*;
44

optd-mvp/src/entities/group.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
use sea_orm::entity::prelude::*;
44

@@ -10,6 +10,7 @@ pub struct Model {
1010
pub status: i8,
1111
pub winner: Option<i32>,
1212
pub cost: Option<i64>,
13+
pub set_size: i32,
1314
pub parent_id: Option<i32>,
1415
pub next_id: Option<i32>,
1516
}

optd-mvp/src/entities/logical_children.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
use sea_orm::entity::prelude::*;
44

optd-mvp/src/entities/logical_expression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
use sea_orm::entity::prelude::*;
44

optd-mvp/src/entities/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
pub mod prelude;
44

optd-mvp/src/entities/physical_children.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
use sea_orm::entity::prelude::*;
44

optd-mvp/src/entities/physical_expression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
use sea_orm::entity::prelude::*;
44

optd-mvp/src/entities/prelude.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
1+
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.2
22
33
#![allow(unused_imports)]
44

optd-mvp/src/memo/persistent/implementation.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@ where
606606
// The expression does not exist yet, so we need to create a new group and new expression.
607607
let group = group::ActiveModel {
608608
status: Set(0), // `GroupStatus::InProgress` status.
609+
set_size: Set(1),
609610
..Default::default()
610611
};
611612

@@ -676,18 +677,24 @@ where
676677
left_group_id: GroupId,
677678
right_group_id: GroupId,
678679
) -> OptimizerResult<GroupId> {
679-
// Without a rank / size field, we have no way of determining which set is better to merge
680-
// into the other. So we will arbitrarily choose to merge the left group into the right
681-
// group here. If rank is added in the future, then merge the smaller set into the larger.
680+
let mut left_root_id = self.get_root_group(left_group_id).await?;
681+
let mut left_root = self.get_group(left_root_id).await?;
682+
let mut left_size = left_root.set_size;
683+
684+
let mut right_root_id = self.get_root_group(right_group_id).await?;
685+
let mut right_root = self.get_group(right_root_id).await?;
686+
let mut right_size = left_root.set_size;
687+
688+
// Rank/size optimization: merge the smaller set into the larger set.
689+
if left_size > right_size {
690+
std::mem::swap(&mut left_root_id, &mut right_root_id);
691+
std::mem::swap(&mut left_root, &mut right_root);
692+
std::mem::swap(&mut left_size, &mut right_size);
693+
}
682694

683-
let left_root_id = self.get_root_group(left_group_id).await?;
684-
let left_root = self.get_group(left_root_id).await?;
685695
// A `None` next pointer means it should technically be pointing to itself.
686696
let left_next = left_root.next_id.unwrap_or(left_root_id.0);
687697
let mut active_left_root = left_root.into_active_model();
688-
689-
let right_root_id = self.get_root_group(right_group_id).await?;
690-
let right_root = self.get_group(right_root_id).await?;
691698
// A `None` next pointer means it should technically be pointing to itself.
692699
let right_next = right_root.next_id.unwrap_or(right_root_id.0);
693700
let mut active_right_root = right_root.into_active_model();

optd-mvp/src/migrator/memo/m20241127_000001_group.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ pub enum Group {
8383
Status,
8484
Winner,
8585
Cost,
86+
SetSize,
8687
ParentId,
8788
NextId,
8889
}
@@ -109,6 +110,7 @@ impl MigrationTrait for Migration {
109110
.on_delete(ForeignKeyAction::SetNull)
110111
.on_update(ForeignKeyAction::Cascade),
111112
)
113+
.col(integer(Group::SetSize))
112114
.col(integer_null(Group::ParentId))
113115
.foreign_key(
114116
ForeignKey::create()

0 commit comments

Comments
 (0)