class_docstr: Perform a database (SQL) merge operation between two DataFrame objects
  using either columns as keys or their row indexes
class_docstr_tok: ["Perform","a","database","(","SQL",")","merge","operation","between","two","DataFrame","objects","using","either","columns","as","keys","or","their","row","indexes"]
code: def _maybe_add_join_keys(self, result, left_indexer, right_indexer):
      left_has_missing = None
      right_has_missing = None
  
      keys = zip(self.join_names, self.left_on, self.right_on)
      for i, (name, lname, rname) in enumerate(keys):
          if not _should_fill(lname, rname):
              continue
  
          take_left, take_right = None, None
  
          if name in result:
              if left_indexer is not None and right_indexer is not None:
                  if name in self.left:
                      if left_has_missing is None:
                          left_has_missing = (left_indexer == -1).any()
  
                      if left_has_missing:
                          take_right = self.right_join_keys[i]
  
                          if not is_dtype_equal(
                              result[name].dtype, self.left[name].dtype
                          ):
                              take_left = self.left[name]._values
  
                  elif name in self.right:
                      if right_has_missing is None:
                          right_has_missing = (
                              right_indexer == -1
                          ).any()
  
                      if right_has_missing:
                          take_left = self.left_join_keys[i]
  
                          if not is_dtype_equal(
                              result[name].dtype, self.right[name].dtype
                          ):
                              take_right = self.right[name]._values
  
          elif left_indexer is not None and is_array_like(
              self.left_join_keys[i]
          ):
              take_left = self.left_join_keys[i]
              take_right = self.right_join_keys[i]
  
          if take_left is not None or take_right is not None:
              if take_left is None:
                  lvals = result[name]._values
              else:
                  lfill = na_value_for_dtype(take_left.dtype)
                  lvals = algos.take_1d(
                      take_left, left_indexer, fill_value=lfill
                  )
  
              if take_right is None:
                  rvals = result[name]._values
              else:
                  rfill = na_value_for_dtype(take_right.dtype)
                  rvals = algos.take_1d(
                      take_right, right_indexer, fill_value=rfill
                  )
  
              # if we have an all missing left_indexer
              # make sure to just use the right values
              mask = left_indexer == -1
              if mask.all():
                  key_col = rvals
              else:
                  key_col = Index(lvals).where(~mask, rvals)
  
              if result._is_label_reference(name):
                  result[name] = key_col
              elif result._is_level_reference(name):
                  if isinstance(result.index, MultiIndex):
                      key_col.name = name
                      idx_list = [
                          result.index.get_level_values(level_name)
                          if level_name != name
                          else key_col
                          for level_name in result.index.names
                      ]
  
                      result.set_index(idx_list, inplace=True)
                  else:
                      result.index = Index(key_col, name=name)
              else:
                  result.insert(
                      i, name or "key_{i}".format(i=i), key_col
                  )
  
imports: import copy
  import string
  import warnings
  import numpy
  from pandas._libs import hashtable, join, lib
  import pandas.compat
  from pandas.compat import filter, lzip, map, range, zip
  from pandas.errors import MergeError
  from pandas.util._decorators import Appender, Substitution
  from pandas.core.dtypes.common import ensure_float64, ensure_int64, ensure_object, is_array_like, is_bool, is_bool_dtype, is_categorical_dtype, is_datetime64_dtype, is_datetime64tz_dtype, is_datetimelike, is_dtype_equal, is_extension_array_dtype, is_float_dtype, is_int64_dtype, is_integer, is_integer_dtype, is_list_like, is_number, is_numeric_dtype, is_object_dtype, needs_i8_conversion
  from pandas.core.dtypes.missing import isnull, na_value_for_dtype
  from pandas import Categorical, DataFrame, Index, MultiIndex, Series, Timedelta
  import pandas.core.algorithms
  from pandas.core.arrays.categorical import _recode_for_categories
  import pandas.core.common
  from pandas.core.frame import _merge_doc
  from pandas.core.internals import concatenate_block_managers, items_overlap_with_suffix
  import pandas.core.sorting
  from pandas.core.sorting import is_int64_overflow_possible
label_desc: Use image node_id 6 for calling the _MergeOperation obj's underlying member method code with example usage: obj._maybe_add_join_keys(result, left_indexer, right_indexer) without return types