<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def issues( self, use_pager: bool = None, *, codes: Optional[Union[int, List[int]]] = None, callables: Optional[Union[str, List[str]]] = None, filenames: Optional[Union[str, List[str]]] = None, ):
 """Lists issues for the selected run. Parameters (all optional):
 use_pager: bool use a unix style pager for output codes: int or list[int] issue codes to filter on callables: str or list[str] callables to filter on (supports wildcards) filenames: str or list[str] filenames to filter on (supports wildcards) String filters support LIKE wildcards (%, _) from SQL: % matches anything (like .* in regex) _ matches 1 character (like . in regex) For example: callables=[ "%occurs.anywhere%", "%at.end", "at.start%", "etc.", ]) """

        pager = self._resolve_pager(use_pager)

        with self.db.make_session() as session:
            query = (
                session.query(
                    IssueInstance.id,
                    FilenameText.contents.label("filename"),
                    IssueInstance.location,
                    Issue.code,
                    CallableText.contents.label("callable"),
                    MessageText.contents.label("message"),
                )
                .filter(IssueInstance.run_id == self.current_run_id)
                .join(FilenameText, FilenameText.id == IssueInstance.filename_id)
                .join(CallableText, CallableText.id == IssueInstance.callable_id)
            )

            if codes is not None:
                query = self._add_list_or_int_filter_to_query(
                    codes, query, Issue.code, "codes"
                )

            if callables is not None:
                query = self._add_list_or_string_filter_to_query(
                    callables, query, CallableText.contents, "callables"
                )

            if filenames is not None:
                query = self._add_list_or_string_filter_to_query(
                    filenames, query, FilenameText.contents, "filenames"
                )

            issues = query.join(Issue, IssueInstance.issue_id == Issue.id).join(
                MessageText, MessageText.id == IssueInstance.message_id
            )

            sources_list = [
                self._get_leaves_issue_instance(
                    session, int(issue.id), SharedTextKind.SOURCE
                )
                for issue in issues
            ]
            sinks_list = [
                self._get_leaves_issue_instance(
                    session, int(issue.id), SharedTextKind.SINK
                )
                for issue in issues
            ]

            issue_strings = [
                self._create_issue_output_string(issue, sources, sinks)
                for issue, sources, sinks in zip(issues, sources_list, sinks_list)
            ]
        issue_output = f"\n{'-' * 80}\n".join(issue_strings)
        pager(issue_output)
        print(f"Found {len(issue_strings)} issues with run_id {self.current_run_id}.")