class_docstr: The query objects are constructed on the client.
code: def _validate_there_are_no_missing_series(self) -> None:
      missing_series = [
          col for col in self.series_columns if col not in self.columns
      ]
      if missing_series:
          raise QueryObjectValidationError(
              _(
                  "The following entries in `series_columns` are missing "
                  "in `columns`: %(columns)s. ",
                  columns=", ".join(f'"{x}"' for x in missing_series),
              )
          )
  
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 14 for calling the QueryObject obj's underlying member method code with example usage: obj._validate_there_are_no_missing_series() without return types