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: Pass the group-by items that can be queried without metrics to the child node.
code: def visit_no_metrics_query_node(
      self, node: NoMetricsGroupByItemSourceNode
  ) -> PushDownResult:
      """Pass the group-by items that can be queried without metrics to the child node."""
      with self._path_from_start_node_tracker.track_node_visit(
          node
      ) as current_traversal_path:
          logger.info(f"Handling {node.ui_description}")
          # This is a case for distinct dimension values from semantic models.
          candidate_specs = (
              self._semantic_manifest_lookup.metric_lookup.group_by_item_specs_for_no_metrics_query()
          )
  
          matching_specs = candidate_specs
          for pattern_to_apply in self._source_spec_patterns:
              matching_specs = InstanceSpecSet.from_specs(
                  pattern_to_apply.match(matching_specs)
              ).linkable_specs
  
          if len(matching_specs) == 0:
              return PushDownResult(
                  candidate_set=GroupByItemCandidateSet.empty_instance(),
                  issue_set=MetricFlowQueryResolutionIssueSet.from_issue(
                      NoMatchingItemsForNoMetricsQuery.from_parameters(
                          parent_issues=(),
                          query_resolution_path=current_traversal_path,
                      )
                  ),
              )
  
          return PushDownResult(
              candidate_set=GroupByItemCandidateSet(
                  specs=tuple(matching_specs),
                  measure_paths=(current_traversal_path,),
                  path_from_leaf_node=current_traversal_path,
              ),
              issue_set=MetricFlowQueryResolutionIssueSet.empty_instance(),
          )
  
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 6 for calling the _PushDownGroupByItemCandidatesVisitor obj's underlying member method code with example usage: obj.visit_no_metrics_query_node(node) and returns: PushDownResult, PushDownResult