@@ -499,8 +499,8 @@ int main(int argc, char* argv[]) {
499499 if (cluster_manager != nullptr ) {
500500 cluster_manager->set_bloom_filter (
501501 args.context_id , args.build_table , args.probe_table ,
502- args.probe_key_col , args.filter_data , args. expected_elements ,
503- args.num_hashes );
502+ args.probe_key_col , std::move ( args.filter_data ) ,
503+ args.expected_elements , args. num_hashes );
504504 }
505505 cloudsql::network::QueryResultsReply reply;
506506 reply.success = true ;
@@ -571,6 +571,30 @@ int main(int argc, char* argv[]) {
571571 bool overall_success = true ;
572572 std::string delivery_errors;
573573
574+ // Hoist bloom filter and key resolution out of per-destination loop
575+ cloudsql::common::BloomFilter bloom;
576+ bool have_bloom = false ;
577+ size_t key_idx = static_cast <size_t >(-1 );
578+
579+ if (cluster_manager->has_bloom_filter (args.context_id )) {
580+ bloom = cluster_manager->get_bloom_filter (args.context_id );
581+ std::string probe_key_col = cluster_manager->get_probe_key_col (args.context_id );
582+
583+ if (!probe_key_col.empty ()) {
584+ auto table_meta_opt = catalog->get_table_by_name (args.table_name );
585+ if (table_meta_opt.has_value ()) {
586+ const auto * table_meta = table_meta_opt.value ();
587+ for (size_t i = 0 ; i < table_meta->columns .size (); ++i) {
588+ if (table_meta->columns [i].name == probe_key_col) {
589+ key_idx = i;
590+ break ;
591+ }
592+ }
593+ }
594+ }
595+ have_bloom = (key_idx != static_cast <size_t >(-1 ));
596+ }
597+
574598 for (auto & [node_id, rows] : partitions) {
575599 const cloudsql::cluster::NodeInfo* target_node = nullptr ;
576600 for (const auto & n : data_nodes) {
@@ -590,42 +614,16 @@ int main(int argc, char* argv[]) {
590614 }
591615
592616 // Apply bloom filter on sender side before sending
593- std::vector<cloudsql::executor::Tuple> rows_to_send =
594- std::move (rows);
595- if (cluster_manager->has_bloom_filter (args.context_id )) {
596- auto bloom =
597- cluster_manager->get_bloom_filter (args.context_id );
598- std::string probe_key_col =
599- cluster_manager->get_probe_key_col (args.context_id );
600-
601- if (!probe_key_col.empty ()) {
602- // Find key column index in current table
603- auto table_meta_opt =
604- catalog->get_table_by_name (args.table_name );
605- if (table_meta_opt.has_value ()) {
606- const auto * table_meta = table_meta_opt.value ();
607- size_t key_idx = static_cast <size_t >(-1 );
608- for (size_t i = 0 ; i < table_meta->columns .size ();
609- ++i) {
610- if (table_meta->columns [i].name ==
611- probe_key_col) {
612- key_idx = i;
613- break ;
614- }
615- }
616-
617- if (key_idx != static_cast <size_t >(-1 )) {
618- std::vector<cloudsql::executor::Tuple> filtered;
619- filtered.reserve (rows_to_send.size ());
620- for (auto & row : rows_to_send) {
621- if (bloom.might_contain (row.get (key_idx))) {
622- filtered.push_back (std::move (row));
623- }
624- }
625- rows_to_send = std::move (filtered);
626- }
617+ std::vector<cloudsql::executor::Tuple> rows_to_send = std::move (rows);
618+ if (have_bloom) {
619+ std::vector<cloudsql::executor::Tuple> filtered;
620+ filtered.reserve (rows_to_send.size ());
621+ for (auto & row : rows_to_send) {
622+ if (bloom.might_contain (row.get (key_idx))) {
623+ filtered.push_back (std::move (row));
627624 }
628625 }
626+ rows_to_send = std::move (filtered);
629627 }
630628
631629 cloudsql::network::PushDataArgs push_args;
0 commit comments