class_docstr: The query objects are constructed on the client.
code: def __init__(  # pylint: disable=too-many-locals
      self,
      *,
      annotation_layers: list[dict[str, Any]] | None = None,
      applied_time_extras: dict[str, str] | None = None,
      apply_fetch_values_predicate: bool = False,
      columns: list[Column] | None = None,
      datasource: BaseDatasource | None = None,
      extras: dict[str, Any] | None = None,
      filters: list[QueryObjectFilterClause] | None = None,
      granularity: str | None = None,
      is_rowcount: bool = False,
      is_timeseries: bool | None = None,
      metrics: list[Metric] | None = None,
      order_desc: bool = True,
      orderby: list[OrderBy] | None = None,
      post_processing: list[dict[str, Any] | None] | None = None,
      row_limit: int | None,
      row_offset: int | None = None,
      series_columns: list[Column] | None = None,
      series_limit: int = 0,
      series_limit_metric: Metric | None = None,
      time_range: str | None = None,
      time_shift: str | None = None,
      **kwargs: Any,
  ):
      self._set_annotation_layers(annotation_layers)
      self.applied_time_extras = applied_time_extras or {}
      self.apply_fetch_values_predicate = (
          apply_fetch_values_predicate or False
      )
      self.columns = columns or []
      self.datasource = datasource
      self.extras = extras or {}
      self.filter = filters or []
      self.granularity = granularity
      self.is_rowcount = is_rowcount
      self._set_is_timeseries(is_timeseries)
      self._set_metrics(metrics)
      self.order_desc = order_desc
      self.orderby = orderby or []
      self._set_post_processing(post_processing)
      self.row_limit = row_limit
      self.row_offset = row_offset or 0
      self._init_series_columns(series_columns, metrics, is_timeseries)
      self.series_limit = series_limit
      self.series_limit_metric = series_limit_metric
      self.time_range = time_range
      self.time_shift = time_shift
      self.from_dttm = kwargs.get("from_dttm")
      self.to_dttm = kwargs.get("to_dttm")
      self.result_type = kwargs.get("result_type")
      self.time_offsets = kwargs.get("time_offsets", [])
      self.inner_from_dttm = kwargs.get("inner_from_dttm")
      self.inner_to_dttm = kwargs.get("inner_to_dttm")
      self._rename_deprecated_fields(kwargs)
      self._move_deprecated_extra_fields(kwargs)
  
imports: from __future__ import annotations
  import json
  import logging
  from datetime import datetime
  from pprint import pformat
  from typing import Any, NamedTuple, TYPE_CHECKING
  from flask import g
  from flask_babel import gettext
  from pandas import DataFrame
  from superset import feature_flag_manager
  from superset.common.chart_data import ChartDataResultType
  from superset.exceptions import InvalidPostProcessingError, QueryClauseValidationException, QueryObjectValidationError
  from superset.sql_parse import sanitize_clause
  from superset.superset_typing import Column, Metric, OrderBy
  from superset.utils import pandas_postprocessing
  from superset.utils.core import DTTM_ALIAS, find_duplicates, get_column_names, get_metric_names, is_adhoc_metric, json_int_dttm_ser, QueryObjectFilterClause
  from superset.utils.hashing import md5_sha_from_dict
label_desc: Use image node_id 1 to create a new QueryObject object  with example: obj = QueryObject()