'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.'

def _retrieve_assets(self, sids, asset_tbl, asset_type):

    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
    misses = tuple((set(sids) - viewkeys(hits)))
    if misses:
        if querying_equities:
            raise EquitiesNotFound(sids=misses)
        else:
            raise FutureContractsNotFound(sids=misses)
    return hits
