code: def _retrieve_assets(self, sids, asset_tbl, asset_type):
          
          # Fastpath for empty request.
          if not sids:
              return {}
  
          cache = self._asset_cache
          hits = {}
  
          querying_equities = issubclass(asset_type, Equity)
          filter_kwargs = (
              _filter_equity_kwargs
              if querying_equities else
              _filter_future_kwargs
          )
  
          rows = self._retrieve_asset_dicts(sids, asset_tbl, querying_equities)
          for row in rows:
              sid = row['sid']
              asset = asset_type(**filter_kwargs(row))
              hits[sid] = cache[sid] = asset
  
          # If we get here, it means something in our code thought that a
          # particular sid was an equity/future and called this function with a
          # concrete type, but we couldn't actually resolve the asset.  This is
          # an error in our code, not a user-input error.
          misses = tuple(set(sids) - viewkeys(hits))
          if misses:
              if querying_equities:
                  raise EquitiesNotFound(sids=misses)
              else:
                  raise FutureContractsNotFound(sids=misses)
          return hits
docs: Internal function for loading assets from a table.
  
          This should be the only method of `AssetFinder` that writes Assets into
          self._asset_cache.
  
          Parameters
          ---------
          sids : iterable of int
              Asset ids to look up.
          asset_tbl : sqlalchemy.Table
              Table from which to query assets.
          asset_type : type
              Type of asset to be constructed.
  
          Returns
          -------
          assets : dict[int -> Asset]
              Dict mapping requested sids to the retrieved assets.