code: def _create_evadb_index(self):
      # Find function expression.
      function_expression, function_expression_signature = None, None
      for project_expr in self.project_expr_list:
          if isinstance(project_expr, FunctionExpression):
              function_expression = project_expr
              function_expression_signature = project_expr.signature()
  
      # Get feature tables.
      feat_tb_catalog_entry = self.table_ref.table.table_obj
  
      # Get feature column.
      feat_col_name = self.col_list[0].name
      feat_col_catalog_entry = [
          col
          for col in feat_tb_catalog_entry.columns
          if col.name == feat_col_name
      ][0]
  
      if function_expression is not None:
          feat_col_name = function_expression.output_objs[0].name
  
      index_catalog_entry = (
          self.catalog().get_index_catalog_entry_by_name(self.name)
      )
      index_path = self._get_evadb_index_save_path()
  
      if index_catalog_entry is not None:
          msg = f"Index {self.name} already exists."
          if self.if_not_exists:
              if (
                  index_catalog_entry.feat_column
                  == feat_col_catalog_entry
                  and index_catalog_entry.function_signature
                  == function_expression_signature
                  and index_catalog_entry.type
                  == self.node.vector_store_type
              ):
                  # Only update index if everything matches.
                  logger.warn(
                      msg + " It will be updated on existing table."
                  )
                  index = VectorStoreFactory.init_vector_store(
                      self.vector_store_type,
                      self.name,
                      **handle_vector_store_params(
                          self.vector_store_type,
                          index_path,
                          self.catalog,
                      ),
                  )
              else:
                  # Skip index update if CREATE INDEX runs on a different index.
                  logger.warn(msg)
                  return
          else:
              logger.error(msg)
              raise ExecutorError(msg)
      else:
          index = None
  
      try:
          # Add features to index.
          for input_batch in self.children[0].exec():
              input_batch.drop_column_alias()
              feat = input_batch.column_as_numpy_array(feat_col_name)
              row_num = input_batch.column_as_numpy_array(
                  ROW_NUM_COLUMN
              )
  
              for i in range(len(input_batch)):
                  row_feat = feat[i].reshape(1, -1)
  
                  # Create new index if not exists.
                  if index is None:
                      input_dim = row_feat.shape[1]
                      index = VectorStoreFactory.init_vector_store(
                          self.vector_store_type,
                          self.name,
                          **handle_vector_store_params(
                              self.vector_store_type,
                              index_path,
                              self.catalog,
                          ),
                      )
                      index.create(input_dim)
  
                  # Row ID for mapping back to the row.
                  index.add([FeaturePayload(row_num[i], row_feat)])
  
          # Persist index.
          index.persist()
  
          # Save to catalog.
          if index_catalog_entry is None:
              self.catalog().insert_index_catalog_entry(
                  self.name,
                  index_path,
                  self.vector_store_type,
                  feat_col_catalog_entry,
                  function_expression_signature,
                  self.index_def,
              )
      except Exception as e:
          # Delete index.
          if index:
              index.delete()
  
          # Throw exception back to user.
          raise ExecutorError(str(e))
  
imports: from pathlib import Path
  import pandas
  from evadb.catalog.catalog_type import VectorStoreType
  from evadb.catalog.sql_config import ROW_NUM_COLUMN
  from evadb.database import EvaDBDatabase
  from evadb.executor.abstract_executor import AbstractExecutor
  from evadb.executor.executor_utils import ExecutorError, handle_vector_store_params
  from evadb.expression.function_expression import FunctionExpression
  from evadb.models.storage.batch import Batch
  from evadb.plan_nodes.create_index_plan import CreateIndexPlan
  from evadb.third_party.databases.interface import get_database_handler
  from evadb.third_party.vector_stores.types import FeaturePayload
  from evadb.third_party.vector_stores.utils import VectorStoreFactory
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 5 for calling the CreateIndexExecutor obj's underlying member method code with example usage: obj._create_evadb_index() without return types