class_docstr: Resolves the specs for the (ambiguous) group-by-items that are in where filters of the resolution DAG.
  
  In the resolution DAG, filters can occur:
  
  * In the query.
  * In the definition of a metric as a filter.
  * In the definition of an input measure to a base metric.
  * In the definition of an input metric to a derived metric.
  
  The concrete specs for the group-by-items are returned in a lookup.
class_docstr_tok: ["Resolves","the","specs","for","the","(","ambiguous",")","group-by-items","that","are","in","where","filters","of","the","resolution","DAG",".","In","the","resolution","DAG",",","filters","can","occur",":","*","In","the","query",".","*","In","the","definition","of","a","metric","as","a","filter",".","*","In","the","definition","of","an","input","measure","to","a","base","metric",".","*","In","the","definition","of","an","input","metric","to","a","derived","metric",".","The","concrete","specs","for","the","group-by-items","are","returned","in","a","lookup","."]
code: def __init__(  # noqa: D
      self,
      manifest_lookup: SemanticManifestLookup,
      resolution_dag: GroupByItemResolutionDag,
      spec_pattern_factory: WhereFilterPatternFactory,
  ) -> None:
      self._manifest_lookup = manifest_lookup
      self._resolution_dag = resolution_dag
      self.spec_pattern_factory = spec_pattern_factory
  
imports: from __future__ import annotations
  import itertools
  import logging
  from typing import List, Sequence
  from dbt_semantic_interfaces.call_parameter_sets import FilterCallParameterSets
  from dbt_semantic_interfaces.implementations.filters.where_filter import PydanticWhereFilterIntersection
  from dbt_semantic_interfaces.protocols import WhereFilter, WhereFilterIntersection
  from typing_extensions import override
  from metricflow.mf_logging.runtime import log_runtime
  from metricflow.model.semantic_manifest_lookup import SemanticManifestLookup
  from metricflow.naming.object_builder_str import ObjectBuilderNameConverter
  from metricflow.query.group_by_item.candidate_push_down.push_down_visitor import DagTraversalPathTracker
  from metricflow.query.group_by_item.filter_spec_resolution.filter_location import WhereFilterLocation
  from metricflow.query.group_by_item.filter_spec_resolution.filter_pattern_factory import WhereFilterPatternFactory
  from metricflow.query.group_by_item.filter_spec_resolution.filter_spec_lookup import FilterSpecResolution, FilterSpecResolutionLookUp, NonParsableFilterResolution, PatternAssociationForWhereFilterGroupByItem, ResolvedSpecLookUpKey
  from metricflow.query.group_by_item.group_by_item_resolver import GroupByItemResolver
  from metricflow.query.group_by_item.resolution_dag.dag import GroupByItemResolutionDag, ResolutionDagSinkNode
  from metricflow.query.group_by_item.resolution_dag.resolution_nodes.base_node import 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.filter_spec_resolver.invalid_where import WhereFilterParsingIssue
  from metricflow.query.issues.issues_base import MetricFlowQueryResolutionIssueSet
label_desc: Use image node_id 1 to create a new WhereFilterSpecResolver object  with example: obj = WhereFilterSpecResolver(manifest_lookup, resolution_dag, spec_pattern_factory)