From e2bb7323d89dc57cbd20cdfbf1617759c17cc5d0 Mon Sep 17 00:00:00 2001
From: Denis Smirnov <sd@picodata.io>
Date: Sat, 31 Dec 2022 18:55:10 +0700
Subject: [PATCH] refactoring: move duplicating code to a vtable method

---
 sbroad-core/src/backend/sql/ir.rs  | 37 +++---------------------------
 sbroad-core/src/executor/vtable.rs | 23 +++++++++++++++++++
 2 files changed, 26 insertions(+), 34 deletions(-)

diff --git a/sbroad-core/src/backend/sql/ir.rs b/sbroad-core/src/backend/sql/ir.rs
index f9cd8aec8a..3420580c30 100644
--- a/sbroad-core/src/backend/sql/ir.rs
+++ b/sbroad-core/src/backend/sql/ir.rs
@@ -10,7 +10,6 @@ use crate::debug;
 use crate::errors::QueryPlannerError;
 use crate::executor::bucket::Buckets;
 use crate::executor::ir::ExecutionPlan;
-use crate::executor::vtable::VTableTuple;
 use crate::ir::expression::Expression;
 use crate::ir::operator::Relational;
 use crate::ir::value::{EncodedValue, Value};
@@ -163,22 +162,7 @@ impl ExecutionPlan {
                 }
                 SyntaxData::VTable(motion_id) => {
                     let vtable = self.get_motion_vtable(*motion_id)?;
-                    let tuples: Vec<&VTableTuple> = match buckets {
-                        Buckets::All => vtable.get_tuples().iter().collect(),
-                        Buckets::Filtered(bucket_ids) => {
-                            if vtable.get_index().is_empty() {
-                                // TODO: Implement selection push-down (join_linker3_test).
-                                vtable.get_tuples().iter().collect()
-                            } else {
-                                bucket_ids
-                                    .iter()
-                                    .filter_map(|bucket_id| vtable.get_index().get(bucket_id))
-                                    .flatten()
-                                    .filter_map(|pos| vtable.get_tuples().get(*pos))
-                                    .collect()
-                            }
-                        }
-                    };
+                    let tuples = (*vtable).get_tuples_with_buckets(buckets);
                     for t in tuples {
                         for v in t {
                             params.push(v.clone());
@@ -364,22 +348,7 @@ impl ExecutionPlan {
                                 .join(",")
                         };
 
-                        let tuples: Vec<&VTableTuple> = match buckets {
-                            Buckets::All => vtable.get_tuples().iter().collect(),
-                            Buckets::Filtered(bucket_ids) => {
-                                if vtable.get_index().is_empty() {
-                                    // TODO: Implement selection push-down (join_linker3_test).
-                                    vtable.get_tuples().iter().collect()
-                                } else {
-                                    bucket_ids
-                                        .iter()
-                                        .filter_map(|bucket_id| vtable.get_index().get(bucket_id))
-                                        .flatten()
-                                        .filter_map(|pos| vtable.get_tuples().get(*pos))
-                                        .collect()
-                                }
-                            }
-                        };
+                        let tuples = (*vtable).get_tuples_with_buckets(buckets);
 
                         if tuples.is_empty() {
                             let values = (0..cols_count)
@@ -417,7 +386,7 @@ impl ExecutionPlan {
                             })?;
 
                             for t in tuples {
-                                for v in t {
+                                for v in t.iter() {
                                     params.push(v.clone());
                                 }
                             }
diff --git a/sbroad-core/src/executor/vtable.rs b/sbroad-core/src/executor/vtable.rs
index 77d21c1509..0449052120 100644
--- a/sbroad-core/src/executor/vtable.rs
+++ b/sbroad-core/src/executor/vtable.rs
@@ -5,6 +5,7 @@ use std::vec;
 use serde::{Deserialize, Serialize};
 
 use crate::errors::QueryPlannerError;
+use crate::executor::bucket::Buckets;
 use crate::ir::relation::Column;
 use crate::ir::transformation::redistribution::{MotionKey, Target};
 use crate::ir::value::Value;
@@ -129,6 +130,28 @@ impl VirtualTable {
         self.index = index.into();
     }
 
+    /// Get vtable's tuples corresponding to the buckets.
+    #[must_use]
+    pub fn get_tuples_with_buckets(&self, buckets: &Buckets) -> Vec<&VTableTuple> {
+        let tuples: Vec<&VTableTuple> = match buckets {
+            Buckets::All => self.get_tuples().iter().collect(),
+            Buckets::Filtered(bucket_ids) => {
+                if self.get_index().is_empty() {
+                    // TODO: Implement selection push-down (join_linker3_test).
+                    self.get_tuples().iter().collect()
+                } else {
+                    bucket_ids
+                        .iter()
+                        .filter_map(|bucket_id| self.get_index().get(bucket_id))
+                        .flatten()
+                        .filter_map(|pos| self.get_tuples().get(*pos))
+                        .collect()
+                }
+            }
+        };
+        tuples
+    }
+
     /// Get virtual table tuples' values, participating in the distribution key.
     ///
     /// # Errors
-- 
GitLab