code: def build_filter(self):
      if self.cfg is None:
          return super(StringFilter, self).handle_missing(None)
  
      action = self.cfg.get("action", "equals")
      if action == "equals" and not len(self.cfg.get("value", [])):
          return super(StringFilter, self).handle_missing(None)
      elif action != "equals" and not self.cfg.get("raw"):
          return super(StringFilter, self).handle_missing(None)
  
      state = self.cfg.get("value", [])
      case_sensitive = self.cfg.get("caseSensitive", False)
      operand = self.cfg.get("operand", "=")
      raw = self.cfg.get("raw")
      fltr = dict(
          value=state,
          operand=operand,
          caseSensitive=case_sensitive,
          action=action,
          raw=raw,
          meta={
              "column": self.column,
              "classification": self.classification,
              "type": self.cfg["type"],
          },
      )
      fmt_string = "{!r}" if self.classification == "S" else "{}"
      if action == "equals":
          if len(state) == 1:
              val_str = fmt_string.format(state[0])
              fltr["query"] = "{} {} {}".format(
                  build_col_key(self.column),
                  "==" if operand == "=" else "!=",
                  val_str,
              )
          else:
              val_str = ", ".join(map(fmt_string.format, state))
              fltr["query"] = "{} {} ({})".format(
                  build_col_key(self.column),
                  "in" if operand == "=" else "not in",
                  val_str,
              )
      elif action in ["startswith", "endswith"]:
          case_insensitive_conversion = (
              "" if case_sensitive else ".str.lower()"
          )
          fltr["query"] = "{}{}.str.{}({!r}, na=False)".format(
              build_col_key(self.column),
              case_insensitive_conversion,
              action,
              raw if case_sensitive else raw.lower(),
          )
          fltr["query"] = handle_ne(fltr["query"], operand)
      elif action in ["contains", "regex"]:
          fltr[
              "query"
          ] = "{}.str.contains({!r}, na=False, case={}, regex={})".format(
              build_col_key(self.column),
              raw,
              "True" if case_sensitive else "False",
              "True" if action == "regex" else "False",
          )
          fltr["query"] = handle_ne(fltr["query"], operand)
      elif action == "length":
          if "," in raw:
              start, end = raw.split(",")
              fltr[
                  "query"
              ] = "{start} <= {col}.str.len() <= {end}".format(
                  col=build_col_key(self.column), start=start, end=end
              )
          else:
              fltr["query"] = "{}.str.len() == {}".format(
                  build_col_key(self.column), raw
              )
          fltr["query"] = handle_ne(fltr["query"], operand)
      return super(StringFilter, self).handle_missing(fltr)
  
imports: import json
  import numpy
  import pandas
  import dtale.global_state
  from dtale.utils import classify_type, find_dtype, format_data, make_list
  from dtale.query import build_col_key
label_desc: Use image node_id 2 for calling the StringFilter obj's underlying member method code with example usage: obj.build_filter() and returns: super, super, super, super