diff --git a/lib/bud/executor/join.rb b/lib/bud/executor/join.rb
index <HASH>..<HASH> 100644
--- a/lib/bud/executor/join.rb
+++ b/lib/bud/executor/join.rb
@@ -588,7 +588,8 @@ module Bud
       key = get_key(item, offset)
       (@hash_tables[offset][key] ||= Set.new).add item
       if @rhs_rcvd and offset == 0
-        push_lhs(key, item)
+        rhs_values = @hash_tables[1][key]
+        process_match(item, rhs_values)
       end
     end
 
@@ -599,16 +600,12 @@ module Bud
       unless @rhs_rcvd
         @rhs_rcvd = true
         @hash_tables[0].each do |key,values|
-          values.each {|item| push_lhs(key, item)}
+          rhs_values = @hash_tables[1][key]
+          values.each {|item| process_match(item, rhs_values)}
         end
       end
     end
 
-    def push_lhs(key, lhs_item)
-      rhs_values = @hash_tables[1][key]
-      process_match(lhs_item, rhs_values)
-    end
-
     def process_match(lhs_item, rhs_values)
       if rhs_values.nil?
         # no corresponding rhs. Include in output
Optimization for notin evaluation.

Hoist a hash table lookup outside of a loop.