class_docstr: Base class for ResolverStrategy.
  
  ResolverStrategy is used with
  [`tfx.dsl.Resolver`](/tfx/api_docs/python/tfx/v1/dsl/Resolver)
  to express the input resolution logic. Currently TFX supports the following
  builtin ResolverStrategy:
  
  - [LatestArtifactStrategy](/tfx/api_docs/python/tfx/v1/dsl/experimental/LatestArtifactStrategy)
  - [LatestBlessedModelStrategy](/tfx/api_docs/python/tfx/v1/dsl/experimental/LatestBlessedModelStrategy)
  - [SpanRangeStrategy](/tfx/api_docs/python/tfx/v1/dsl/experimental/SpanRangeStrategy)
  
  A resolver strategy defines a type behavior used for input selection. A
  resolver strategy subclass must override the `resolve_artifacts()` function
  which takes a Dict[str, List[Artifact]] as parameters and returns the resolved
  dict of the same type.
docstr: Resolves artifacts from channels, optionally querying MLMD if needed.
  
  In asynchronous execution mode, resolver classes may composed in sequence
  where the resolve_artifacts() result from the previous resolver instance
  would be passed to the next resolver instance's resolve_artifacts() inputs.
  
  If resolve_artifacts() returns None, it is considered as "no inputs
  available", and the remaining resolvers will not be executed.
  
  Also if resolve_artifacts() omits any key from the input_dict it will not
  be available from the downstream resolver instances. General recommendation
  is to preserve all keys in the input_dict unless you have specific reason.
  
  Args:
    store: An MLMD MetadataStore.
    input_dict: The input_dict to resolve from.
  
  Returns:
    If all entries has enough data after the resolving, returns the resolved
    input_dict. Otherise, return None.
docstr_tok: ["Resolves","artifacts","from","channels",",","optionally","querying","MLMD","if","needed",".","In","asynchronous","execution","mode",",","resolver","classes","may","composed","in","sequence","where","the","resolve_artifacts","(",")","result","from","the","previous","resolver","instance","would","be","passed","to","the","next","resolver","instance","'s","resolve_artifacts","(",")","inputs",".","If","resolve_artifacts","(",")","returns","None",",","it","is","considered","as","``","no","inputs","available","''",",","and","the","remaining","resolvers","will","not","be","executed",".","Also","if","resolve_artifacts","(",")","omits","any","key","from","the","input_dict","it","will","not","be","available","from","the","downstream","resolver","instances",".","General","recommendation","is","to","preserve","all","keys","in","the","input_dict","unless","you","have","specific","reason",".","Args",":","store",":","An","MLMD","MetadataStore",".","input_dict",":","The","input_dict","to","resolve","from",".","Returns",":","If","all","entries","has","enough","data","after","the","resolving",",","returns","the","resolved","input_dict",".","Otherise",",","return","None","."]
code: def resolve_artifacts(
      self,
      store: mlmd.MetadataStore,
      input_dict: Dict[str, List[types.Artifact]],
  ) -> Optional[Dict[str, List[types.Artifact]]]:
      """Resolves artifacts from channels, optionally querying MLMD if needed.
  
      In asynchronous execution mode, resolver classes may composed in sequence
      where the resolve_artifacts() result from the previous resolver instance
      would be passed to the next resolver instance's resolve_artifacts() inputs.
  
      If resolve_artifacts() returns None, it is considered as "no inputs
      available", and the remaining resolvers will not be executed.
  
      Also if resolve_artifacts() omits any key from the input_dict it will not
      be available from the downstream resolver instances. General recommendation
      is to preserve all keys in the input_dict unless you have specific reason.
  
      Args:
        store: An MLMD MetadataStore.
        input_dict: The input_dict to resolve from.
  
      Returns:
        If all entries has enough data after the resolving, returns the resolved
        input_dict. Otherise, return None.
      """
  
imports: import abc
  from typing import Any, Dict, List, Optional, Type, Mapping
  from tfx import types
  from tfx.dsl.components.base import base_driver
  from tfx.dsl.components.base import base_node
  from tfx.dsl.input_resolution import resolver_op
  from tfx.orchestration import data_types
  from tfx.orchestration import metadata
  from tfx.types import channel
  from tfx.types import channel_utils
  from tfx.types import resolved_channel
  from tfx.utils import doc_controls
  from tfx.utils import json_utils
  from tfx.utils import typing_utils
  import ml_metadata
label_desc: Use image node_id 1 for calling the ResolverStrategy obj's underlying member method code with example usage: obj.resolve_artifacts(store, input_dict) without return types