Returns the filter solvers that can solve the given filter.

        Arguments
        ---------
        filter : dataql.resources.BaseFilter
            An instance of the a subclass of ``BaseFilter`` for which we want to get the solver
            classes that can solve it.

        Returns
        -------
        list
            The list of filter solvers instances that can solve the given resource.

        Raises
        ------
        dataql.solvers.exceptions.SolverNotFound
            When no solver is able to solve the given filter.

        Example
        -------

        >>> from dataql.resources import Filter
        >>> registry = Registry()
        >>> registry.get_filter_solvers(Filter(name='foo'))
        [<FilterSolver>]
        >>> registry.get_filter_solvers(None) # doctest: +ELLIPSIS
        Traceback (most recent call last):
        dataql.solvers.exceptions.SolverNotFound: No solvers found for this kind of object:...

def get_filter_solvers(self, filter_):
        """Returns the filter solvers that can solve the given filter.

        Arguments
        ---------
        filter : dataql.resources.BaseFilter
            An instance of the a subclass of ``BaseFilter`` for which we want to get the solver
            classes that can solve it.

        Returns
        -------
        list
            The list of filter solvers instances that can solve the given resource.

        Raises
        ------
        dataql.solvers.exceptions.SolverNotFound
            When no solver is able to solve the given filter.

        Example
        -------

        >>> from dataql.resources import Filter
        >>> registry = Registry()
        >>> registry.get_filter_solvers(Filter(name='foo'))
        [<FilterSolver>]
        >>> registry.get_filter_solvers(None) # doctest: +ELLIPSIS
        Traceback (most recent call last):
        dataql.solvers.exceptions.SolverNotFound: No solvers found for this kind of object:...

        """

        solvers_classes = [s for s in self.filter_solver_classes if s.can_solve(filter_)]

        if solvers_classes:
            solvers = []

            for solver_class in solvers_classes:

                # Put the solver instance in the cache if not cached yet.
                if solver_class not in self._filter_solvers_cache:
                    self._filter_solvers_cache[solver_class] = solver_class(self)

                solvers.append(self._filter_solvers_cache[solver_class])

            return solvers

        raise SolverNotFound(self, filter_)