class_docstr: The result that is pushed down from the root nodes to the leaf nodes to resolve ambiguous group-by items.
class_docstr_tok: ["The","result","that","is","pushed","down","from","the","root","nodes","to","the","leaf","nodes","to","resolve","ambiguous","group-by","items","."]
code: def __post_init__(self) -> None:  # noqa: D
      # If there are no errors, there should be a candidate spec in each candidate set.
      # If there are errors, there shouldn't be any candidate sets.
      assert (
          not self.issue_set.has_errors
          and not self.candidate_set.is_empty
      ) or (
          self.issue_set.has_errors and self.candidate_set.is_empty
      ), mf_pformat_many(
          "candidate_set / issue_set mismatch:",
          {
              "candidate_set": self.candidate_set,
              "issue_set": self.issue_set,
          },
      )
  
imports: from __future__ import annotations
  import logging
  from contextlib import contextmanager
  from dataclasses import dataclass
  from typing import Dict, Iterator, List, Optional, Sequence, Set, Tuple
  from dbt_semantic_interfaces.enum_extension import assert_values_exhausted
  from dbt_semantic_interfaces.type_enums import MetricType
  from typing_extensions import override
  from metricflow.mf_logging.formatting import indent
  from metricflow.mf_logging.pretty_print import mf_pformat, mf_pformat_many
  from metricflow.model.semantic_manifest_lookup import SemanticManifestLookup
  from metricflow.model.semantics.linkable_element_properties import LinkableElementProperties
  from metricflow.query.group_by_item.candidate_push_down.group_by_item_candidate import GroupByItemCandidateSet
  from metricflow.query.group_by_item.resolution_dag.resolution_nodes.base_node import GroupByItemResolutionNode, GroupByItemResolutionNodeVisitor
  from metricflow.query.group_by_item.resolution_dag.resolution_nodes.measure_source_node import MeasureGroupByItemSourceNode
  from metricflow.query.group_by_item.resolution_dag.resolution_nodes.metric_resolution_node import MetricGroupByItemResolutionNode
  from metricflow.query.group_by_item.resolution_dag.resolution_nodes.no_metrics_query_source_node import NoMetricsGroupByItemSourceNode
  from metricflow.query.group_by_item.resolution_dag.resolution_nodes.query_resolution_node import QueryGroupByItemResolutionNode
  from metricflow.query.group_by_item.resolution_path import MetricFlowQueryResolutionPath
  from metricflow.query.issues.group_by_item_resolver.invalid_use_of_date_part import MetricExcludesDatePartIssue
  from metricflow.query.issues.group_by_item_resolver.no_common_items import NoCommonItemsInParents
  from metricflow.query.issues.group_by_item_resolver.no_matching_items_for_measure import NoMatchingItemsForMeasure
  from metricflow.query.issues.group_by_item_resolver.no_matching_items_for_no_metrics_query import NoMatchingItemsForNoMetricsQuery
  from metricflow.query.issues.issues_base import MetricFlowQueryResolutionIssueSet
  from metricflow.query.suggestion_generator import QueryItemSuggestionGenerator
  from metricflow.specs.patterns.base_time_grain import BaseTimeGrainPattern
  from metricflow.specs.patterns.none_date_part import NoneDatePartPattern
  from metricflow.specs.patterns.spec_pattern import SpecPattern
  from metricflow.specs.specs import InstanceSpecSet, LinkableInstanceSpec
label_desc: Use image node_id 1 for calling the PushDownResult obj's underlying member method code with example usage: obj.__post_init__() without return types