code: def tile(cls, op: "DataFrameBloomFilter"):
      df1, df2 = op.inputs
      # use df2's chunks to build bloom filter
      chunks = []
      for c in df2.chunks:
          build_op = DataFrameBloomFilter(
              on=op.right_on,
              max_elements=op.max_elements,
              error_rate=op.error_rate,
              execution_stage="build",
          )
          chunks.append(build_op.new_chunk(inputs=[c]))
  
      # union all chunk filters
      combine_size = op.combine_size
      while len(chunks) > combine_size:
          new_chunks = []
          for i in range(0, len(chunks), combine_size):
              chks = chunks[i : i + combine_size]
              if len(chks) == 1:
                  chk = chks[0]
              else:
                  union_op = DataFrameBloomFilter(
                      execution_stage="union"
                  )
                  for j, c in enumerate(chks):
                      c._index = (j, 0)
                  chk = union_op.new_chunk(chks)
              new_chunks.append(chk)
          chunks = new_chunks
      if len(chunks) > 1:
          union_op = DataFrameBloomFilter(execution_stage="union")
          filter_chunk = union_op.new_chunk(chunks)
      else:
          filter_chunk = chunks[0]
  
      filter_chunk.is_broadcaster = True
      # filter df1
      out_chunks = []
      for chunk in df1.chunks:
          filter_op = DataFrameBloomFilter(
              on=op.left_on, execution_stage="filter"
          )
          params = chunk.params.copy()
          params["shape"] = (np.nan, chunk.shape[1])
          params["index_value"] = parse_index(pd.RangeIndex(-1))
          out_chunks.append(
              filter_op.new_chunk([chunk, filter_chunk], **params)
          )
  
      new_op = op.copy()
      df1_params = df1.params.copy()
      df1_params["chunks"] = out_chunks
      df1_params["nsplits"] = (
          (np.nan,) * len(out_chunks),
          df1.nsplits[1],
      )
      return new_op.new_dataframes(op.inputs, **df1_params)
  
imports: from typing import Union, List, Any
  import numpy
  import pandas
  from ...config import options
  from ...core import OutputType
  from ...core.context import Context
  from ...lib.bloom_filter import BloomFilter
  from ...serialization.serializables import AnyField, Int64Field, Float64Field, StringField
  from ...None import opcodes
  from ...typing import TileableType
  from ..operands import DataFrameOperandMixin, DataFrameOperand
  from ..utils import parse_index
label_desc: Use image node_id 3 for calling the DataFrameBloomFilter obj's underlying member method code with example usage: obj.tile(cls, op) and returns: new_op