diff --git a/sbroad-core/src/ir/relation.rs b/sbroad-core/src/ir/relation.rs index 8ca0574d011c76bbc13be560afc3dfb92db62ed5..75b7a529f5d4f823eb3b6dc76b380199a9993c80 100644 --- a/sbroad-core/src/ir/relation.rs +++ b/sbroad-core/src/ir/relation.rs @@ -9,7 +9,6 @@ use ahash::AHashMap; use smol_str::{format_smolstr, SmolStr, ToSmolStr}; -use std::cmp::Ordering; use std::collections::{HashMap, HashSet}; use std::fmt::{self, Formatter}; use tarantool::index::Metadata as IndexMetadata; @@ -716,23 +715,24 @@ impl Table { if self.is_global() { return Ok(None); } - let positions: Vec<usize> = self - .columns - .iter() - .enumerate() - .filter(|(_, col)| col.role == ColumnRole::Sharding) - .map(|(pos, _)| pos) - .collect(); - match positions.len().cmp(&1) { - Ordering::Equal => Ok(Some(positions[0])), - Ordering::Greater => Err(SbroadError::UnexpectedNumberOfValues( - "Table has more than one bucket_id column".into(), - )), - Ordering::Less => Err(SbroadError::UnexpectedNumberOfValues(format_smolstr!( + let mut bucket_id_pos = None; + for (pos, col) in self.columns.iter().enumerate() { + if col.role == ColumnRole::Sharding { + if bucket_id_pos.is_some() { + return Err(SbroadError::UnexpectedNumberOfValues( + "Table has more than one bucket_id column".into(), + )); + } + bucket_id_pos = Some(pos); + } + } + if bucket_id_pos.is_none() { + return Err(SbroadError::UnexpectedNumberOfValues(format_smolstr!( "Table {} has no bucket_id columns", self.name - ))), + ))); } + Ok(bucket_id_pos) } #[must_use]