Skip to content

Commit 58e3f55

Browse files
authored
Merge pull request #5 from oniony/routine-performance-issue
fix(performance): Fixed issue with routine comparisons
2 parents 31d817d + e368620 commit 58e3f55

File tree

161 files changed

+804
-838
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+804
-838
lines changed

src/compare/mod.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ impl Comparer {
8989
let left_routines = self.left_db.routines(schema_name)?;
9090
let right_routines = self.right_db.routines(schema_name)?;
9191

92+
let left_routine_privileges_by_signature = self.left_db.routine_privileges(schema_name)?;
93+
let right_routine_privileges_by_signature = self.right_db.routine_privileges(schema_name)?;
94+
9295
let mut right_routines_map: HashMap<String, Routine> = right_routines.into_iter().map(|t| (t.signature.clone(), t)).collect();
9396
let mut entries = Vec::new();
9497

@@ -100,8 +103,11 @@ impl Comparer {
100103
entries.push(RoutineRemoved { routine_signature: left_routine.signature });
101104
},
102105
Some(rr) => {
106+
let left_routine_privileges = left_routine_privileges_by_signature.get(&left_routine.signature).unwrap();
107+
let right_routine_privileges = right_routine_privileges_by_signature.get(&left_routine.signature).unwrap();
108+
103109
let properties = self.compare_routine_properties(&left_routine, rr);
104-
let privileges = self.compare_routine_privileges(schema_name, &left_routine.signature)?;
110+
let privileges = self.compare_routine_privileges(left_routine_privileges, right_routine_privileges)?;
105111

106112
entries.push(RoutineMaintained { routine_signature: left_routine.signature, properties, privileges });
107113

@@ -143,19 +149,16 @@ impl Comparer {
143149
}
144150
}
145151

146-
fn compare_routine_privileges(&mut self, schema_name: &str, routine_signature: &str) -> Result<Report<PrivilegeComparison>, Error> {
152+
fn compare_routine_privileges(&mut self, left_routine_privileges: &Vec<Privilege>, right_routine_privileges: &Vec<Privilege>) -> Result<Report<PrivilegeComparison>, Error> {
147153
if self.ignore_privileges {
148154
return Ok(Report { entries: vec![] })
149155
}
150156

151-
let left_routine_privileges = self.left_db.routine_privileges(schema_name, routine_signature)?;
152-
let right_routine_privileges = self.right_db.routine_privileges(schema_name, routine_signature)?;
153-
154157
Ok(self.compare_privileges(left_routine_privileges, right_routine_privileges))
155158
}
156159

157-
fn compare_privileges(&self, left_privileges: Vec<Privilege>, right_privileges: Vec<Privilege>) -> Report<PrivilegeComparison> {
158-
let mut right_privileges_map: HashMap<(String, String, String), Privilege> = right_privileges.into_iter().map(|c| ((c.privilege_type.clone(), c.grantor.clone(), c.grantee.clone()), c)).collect();
160+
fn compare_privileges(&self, left_privileges: &Vec<Privilege>, right_privileges: &Vec<Privilege>) -> Report<PrivilegeComparison> {
161+
let mut right_privileges_map: HashMap<(String, String, String), &Privilege> = right_privileges.into_iter().map(|c| ((c.privilege_type.clone(), c.grantor.clone(), c.grantee.clone()), c)).collect();
159162
let mut entries = Vec::new();
160163

161164
for left_privilege in left_privileges {
@@ -173,7 +176,7 @@ impl Comparer {
173176
}
174177

175178
if right_privileges_map.len() > 0 {
176-
let mut added_privileges: Vec<&Privilege> = right_privileges_map.values().collect();
179+
let mut added_privileges: Vec<&&Privilege> = right_privileges_map.values().collect();
177180
added_privileges.sort_unstable_by_key(|rp| (&rp.privilege_type, &rp.grantor, &rp.grantee));
178181

179182
for added_privilege in added_privileges {
@@ -293,7 +296,7 @@ impl Comparer {
293296
let left_table_privileges = self.left_db.table_privileges(schema_name, table_name)?;
294297
let right_table_privileges = self.right_db.table_privileges(schema_name, table_name)?;
295298

296-
Ok(self.compare_privileges(left_table_privileges, right_table_privileges))
299+
Ok(self.compare_privileges(&left_table_privileges, &right_table_privileges))
297300
}
298301

299302
fn compare_table_columns(&mut self, schema_name: &str, table_name: &str) -> Result<Report<TableColumnComparison>, Error> {
@@ -365,7 +368,7 @@ impl Comparer {
365368
let left_column_privileges = self.left_db.column_privileges(schema_name, table_name, column_name)?;
366369
let right_column_privileges = self.right_db.column_privileges(schema_name, table_name, column_name)?;
367370

368-
Ok(self.compare_privileges(left_column_privileges, right_column_privileges))
371+
Ok(self.compare_privileges(&left_column_privileges, &right_column_privileges))
369372
}
370373

371374
fn compare_table_constraints(&mut self, schema_name: &str, table_name: &str) -> Result<Report<TableConstraintComparison>, Error> {

src/db/mod.rs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod thing;
22

3+
use std::collections::HashMap;
34
use postgres::{Client, NoTls, Error};
45
use crate::db::thing::{Column, Constraint, Privilege, Routine, Schema, Sequence, Table, Trigger, View};
56

@@ -189,11 +190,10 @@ ORDER BY
189190
Ok(routines)
190191
}
191192

192-
pub fn routine_privileges(&mut self, schema_name: &str, routine_signature: &str) -> Result<Vec<Privilege>, Error> {
193-
let mut routine_privileges = Vec::new();
193+
pub fn routine_privileges(&mut self, schema_name: &str) -> Result<HashMap<String, Vec<Privilege>>, Error> {
194+
let mut privilegess_by_signature = HashMap::new();
194195

195196
let rows = self.connection.query(r#"
196-
WITH schema_routines AS (
197197
SELECT
198198
rp.grantor,
199199
rp.grantee,
@@ -210,27 +210,22 @@ WITH schema_routines AS (
210210
WHERE
211211
rp.routine_schema = $1 AND
212212
rp.grantor != rp.grantee
213-
)
214-
SELECT
215-
grantor,
216-
grantee,
217-
privilege_type,
218-
is_grantable
219-
FROM
220-
schema_routines
221-
WHERE
222-
signature = $2
223-
ORDER BY
224-
signature,
225-
privilege_type;"#,
226-
&[&schema_name, &routine_signature])?;
213+
ORDER BY
214+
signature,
215+
privilege_type;"#,
216+
&[&schema_name])?;
227217

228218
for row in rows {
229219
let grantor: String = row.get(0);
230220
let grantee: String = row.get(1);
231-
let privilege_type: String = row.get(2);
232-
let is_grantable: String = row.get(3);
221+
let signature: String = row.get(2);
222+
let privilege_type: String = row.get(3);
223+
let is_grantable: String = row.get(4);
233224

225+
let routine_privileges = privilegess_by_signature
226+
.entry(signature)
227+
.or_insert_with(|| Vec::new());
228+
234229
let routine_privilege = Privilege {
235230
grantor,
236231
grantee,
@@ -241,7 +236,7 @@ ORDER BY
241236
routine_privileges.push(routine_privilege);
242237
}
243238

244-
Ok(routine_privileges)
239+
Ok(privilegess_by_signature)
245240
}
246241

247242
pub fn schema(&mut self, schema_name: &str) -> Result<Option<Schema>, Error> {

tests/column-added/expected.txt

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/column-added/left.sql

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/column-added/right.sql

Lines changed: 0 additions & 5 deletions
This file was deleted.

tests/column-changed/args

Whitespace-only changes.

tests/column-changed/expected.txt

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/column-changed/left.sql

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/column-changed/right.sql

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/column-ordering-changed-ignored/args

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)