def search_robust(self, **query):
    '\n        Return dataset types that match match-able fields and dict of remaining un-matchable fields.\n\n        :param dict query:\n        :rtype: __generator[(DatasetType, dict)]\n        '
    for type_ in self.get_all():
        q = query.copy()
        if (q.pop('product', type_.name) != type_.name):
            continue
        if (q.pop('metadata_type', type_.metadata_type.name) != type_.metadata_type.name):
            continue
        for (key, value) in list(q.items()):
            try:
                exprs = fields.to_expressions(type_.metadata_type.dataset_fields.get, **{key: value})
            except UnknownFieldError as e:
                break
            try:
                if all((expr.evaluate(type_.metadata_doc) for expr in exprs)):
                    q.pop(key)
                else:
                    break
            except (AttributeError, KeyError, ValueError) as e:
                continue
        else:
            (yield (type_, q))
Return dataset types that match match-able fields and dict of remaining un-matchable fields.

:param dict query:
:rtype: __generator[(DatasetType, dict)]
def search_robust(self, **query):
    '\n        Return dataset types that match match-able fields and dict of remaining un-matchable fields.\n\n        :param dict query:\n        :rtype: __generator[(DatasetType, dict)]\n        '
    for type_ in self.get_all():
        q = query.copy()
        if (q.pop('product', type_.name) != type_.name):
            continue
        if (q.pop('metadata_type', type_.metadata_type.name) != type_.metadata_type.name):
            continue
        for (key, value) in list(q.items()):
            try:
                exprs = fields.to_expressions(type_.metadata_type.dataset_fields.get, **{key: value})
            except UnknownFieldError as e:
                break
            try:
                if all((expr.evaluate(type_.metadata_doc) for expr in exprs)):
                    q.pop(key)
                else:
                    break
            except (AttributeError, KeyError, ValueError) as e:
                continue
        else:
            (yield (type_, q))