docstr: Receive query as AST (abstract syntax tree) and act upon it somehow.
  
  Args:
      query (ASTNode): sql query represented as AST. Usually it should be ast.Update
  Returns:
      None
docstr_tok: ["Receive","query","as","AST","(","abstract","syntax","tree",")","and","act","upon","it","somehow",".","Args",":","query","(","ASTNode",")",":","sql","query","represented","as","AST",".","Usually","it","should","be","ast.Update","Returns",":","None"]
code: def update(self, query: ast.Update) -> None:
      """Receive query as AST (abstract syntax tree) and act upon it somehow.
  
      Args:
          query (ASTNode): sql query represented as AST. Usually it should be ast.Update
      Returns:
          None
      """
      conditions = extract_comparison_conditions(query.where)
      # Get page id and component id from query
      pageId = None
      componentId = None
      for condition in conditions:
          if condition[1] == "page_id" and condition[0] == "=":
              pageId = condition[2]
          elif condition[1] == "component_id" and condition[0] == "=":
              componentId = condition[2]
          else:
              raise Exception(
                  "page_id and component_id both are required"
              )
  
      data = {"translations": {"name": {}, "description": {}}}
      for key, value in query.update_columns.items():
          if isinstance(value, Constant):
              if re.match(r"^translations_name_in_[a-zA-Z\-]+$", key):
                  lang_code = key.split("_")[-1]
                  if lang_code not in langCodes:
                      raise Exception(
                          f"Invalid language code {lang_code}"
                      )
                  data["translations"]["name"][lang_code] = value.value
              elif re.match(r"^translations_desc_in_[a-zA-Z\-]+$", key):
                  lang_code = key.split("_")[-1]
                  if lang_code not in langCodes:
                      raise Exception(
                          f"Invalid language code {lang_code}"
                      )
                  data["translations"]["description"][
                      lang_code
                  ] = value.value
              else:
                  data[key] = value.value
      self.handler.call_instatus_api(
          endpoint=f"/v1/{pageId}/components/{componentId}",
          method="PUT",
          json_data=data,
      )
  
file_path: mindsdb/mindsdb/integrations/handlers/instatus_handler/instatus_tables.py
imports: from typing import List
  import pandas
  from mindsdb.integrations.libs.api_handler import APITable
  from mindsdb_sql.parser import ast
  from mindsdb.integrations.utilities.sql_utils import extract_comparison_conditions
  from mindsdb_sql.parser.ast.select.constant import Constant
  import json
  import re
label_desc: Use image node_id 3 for calling the Components obj's underlying member method code with example usage: obj.update(query) without return types