code: def test_expression_tree_signature(self):
      plan = get_logical_query_plan(
          self.evadb,
          "SELECT id FROM MyVideo WHERE DummyMultiObjectDetector(data).labels @> ['person'];",
      )
      signature = (
          next(plan.find_all(LogicalFilter))
          .predicate.children[0]
          .signature()
      )
      function_id = (
          self.evadb.catalog()
          .get_function_catalog_entry_by_name(
              "DummyMultiObjectDetector"
          )
          .row_id
      )
      table_entry = self.evadb.catalog().get_table_catalog_entry(
          "MyVideo"
      )
      col_id = (
          self.evadb.catalog()
          .get_column_catalog_entry(table_entry, "data")
          .row_id
      )
      self.assertEqual(
          signature,
          f"DummyMultiObjectDetector[{function_id}](MyVideo.data[{col_id}])",
      )
  
imports: import unittest
  from test.util import create_dummy_4d_batches, create_dummy_batches, create_sample_video, create_table, file_remove, get_evadb_for_testing, get_logical_query_plan, load_functions_for_testing, shutdown_ray
  import numpy
  import pandas
  import pytest
  from evadb.binder.binder_utils import BinderError
  from evadb.models.storage.batch import Batch
  from evadb.optimizer.operators import LogicalFilter
  from evadb.server.command_handler import execute_query_fetch_all
label_desc: Use image node_id 28 for calling the SelectExecutorTest obj's underlying member method code with example usage: obj.test_expression_tree_signature() without return types