class_docstr: A visitor that implements the logic for group-by-item resolution using the resolution DAG.
  
  Please see the behavior at each node for more details. Overall, this visitor pushes candidates that match an
  ambiguous group-by-item pattern from the root nodes (representing measures / the specs available for those
  measures) to the leaf node (the query for metrics / valid group-by items for querying). For nodes with multiple
  parents, the candidates from each parent are intersected and passed to the child node.
class_docstr_tok: ["A","visitor","that","implements","the","logic","for","group-by-item","resolution","using","the","resolution","DAG",".","Please","see","the","behavior","at","each","node","for","more","details",".","Overall",",","this","visitor","pushes","candidates","that","match","an","ambiguous","group-by-item","pattern","from","the","root","nodes","(","representing","measures","\/","the","specs","available","for","those","measures",")","to","the","leaf","node","(","the","query","for","metrics","\/","valid","group-by","items","for","querying",")",".","For","nodes","with","multiple","parents",",","the","candidates","from","each","parent","are","intersected","and","passed","to","the","child","node","."]
docstr: Helper method that merges push down results from parents into a single result.
  
  This logic is shared between several nodes. In general, a node intersects the candidate sets from the parents
  to form a new candidate set, and passes that down to the child node. This handles generation of an issue if
  the parent candidate sets don't have a common candidate.
code: def _merge_push_down_results_from_parents(
      self,
      push_down_results_from_parents: Dict[
          GroupByItemResolutionNode, PushDownResult
      ],
      current_traversal_path: MetricFlowQueryResolutionPath,
  ) -> PushDownResult:
      """Helper method that merges push down results from parents into a single result.
  
      This logic is shared between several nodes. In general, a node intersects the candidate sets from the parents
      to form a new candidate set, and passes that down to the child node. This handles generation of an issue if
      the parent candidate sets don't have a common candidate.
      """
      merged_issue_set: MetricFlowQueryResolutionIssueSet = MetricFlowQueryResolutionIssueSet.merge_iterable(
          parent_candidate_set.issue_set
          for parent_candidate_set in push_down_results_from_parents.values()
      )
  
      if merged_issue_set.has_errors:
          return PushDownResult(
              candidate_set=GroupByItemCandidateSet.empty_instance(),
              issue_set=merged_issue_set,
          )
  
      parent_candidate_sets = tuple(
          parent_candidate_set.candidate_set
          for parent_candidate_set in push_down_results_from_parents.values()
      )
      intersected_candidate_set = GroupByItemCandidateSet.intersection(
          path_from_leaf_node=current_traversal_path,
          candidate_sets=parent_candidate_sets,
      )
  
      if intersected_candidate_set.is_empty:
          return PushDownResult(
              candidate_set=intersected_candidate_set,
              issue_set=merged_issue_set.add_issue(
                  NoCommonItemsInParents.from_parameters(
                      query_resolution_path=current_traversal_path,
                      parent_node_to_candidate_set={
                          parent_node: push_down_result.candidate_set
                          for parent_node, push_down_result in push_down_results_from_parents.items()
                      },
                      parent_issues=(),
                  )
              ),
          )
      return PushDownResult(
          candidate_set=intersected_candidate_set,
          issue_set=merged_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 3 for calling the _PushDownGroupByItemCandidatesVisitor obj's underlying member method code with example usage: obj._merge_push_down_results_from_parents(push_down_results_from_parents, current_traversal_path) and returns: PushDownResult, PushDownResult, PushDownResult