Skip to content

Group coverage project filter

drew stachon requested to merge group-coverage-project-filter into master

What does this MR do?

This merge request adds filtering by project_ids: [] to the Group::Analytics::CoverageReportsController

Does this MR meet the acceptance criteria?

Conformity

SQL Changes

Original query:

SELECT
    "ci_daily_build_group_report_results".*
FROM
    "ci_daily_build_group_report_results"
WHERE
    "ci_daily_build_group_report_results"."project_id" = 1
    AND "ci_daily_build_group_report_results"."ref_path" = 'refs/heads/master'
    AND "ci_daily_build_group_report_results"."date" BETWEEN '2020-03-09'
    AND '2020-03-10'
ORDER BY
    "ci_daily_build_group_report_results"."date" DESC,
    "ci_daily_build_group_report_results"."group_name" ASC nil

And it's execution plan from #database-lab:

 Sort  (cost=3.59..3.59 rows=1 width=101) (actual time=12.283..12.283 rows=0 loops=1)
   Sort Key: ci_daily_build_group_report_results.date DESC, ci_daily_build_group_report_results.group_name
   Sort Method: quicksort  Memory: 25kB
   Buffers: shared hit=9 read=4
   I/O Timings: read=11.785
   ->  Index Scan using index_daily_build_group_report_results_unique_columns on public.ci_daily_build_group_report_results  (cost=0.55..3.58 rows=1 width=101) (actual time=12.009..12.009 rows=0 loops=1)
         Index Cond: ((ci_daily_build_group_report_results.project_id = 1) AND (ci_daily_build_group_report_results.ref_path = 'refs/heads/master'::text) AND (ci_daily_build_group_report_results.date >= '2020-08-01'::date) AND (ci_daily_build_group_report_results.date <= '2020-08-31'::date))
         Buffers: shared hit=3 read=4
         I/O Timings: read=11.785

New Query:

SELECT
    "ci_daily_build_group_report_results".*
FROM
    "ci_daily_build_group_report_results"
WHERE
    "ci_daily_build_group_report_results"."project_id" IN (
        SELECT
            "projects"."id"
        FROM
            "projects"
        WHERE
            "projects"."namespace_id" = 3)
    AND "ci_daily_build_group_report_results"."ref_path" = 'refs/heads/master'
    AND "ci_daily_build_group_report_results"."date" BETWEEN '2020-08-01'
    AND '2020-08-31'
ORDER BY
    "ci_daily_build_group_report_results"."date" DESC,
    "ci_daily_build_group_report_results"."group_name" ASC
LIMIT 1000

and the new plan:

 Limit  (cost=116.72..116.73 rows=1 width=101) (actual time=0.128..0.128 rows=0 loops=1)
   Buffers: shared hit=8
   ->  Sort  (cost=116.72..116.73 rows=1 width=101) (actual time=0.127..0.127 rows=0 loops=1)
         Sort Key: ci_daily_build_group_report_results.date DESC, ci_daily_build_group_report_results.group_name
         Sort Method: quicksort  Memory: 25kB
         Buffers: shared hit=8
         ->  Nested Loop  (cost=0.99..116.71 rows=1 width=101) (actual time=0.114..0.114 rows=0 loops=1)
               Buffers: shared hit=8
               ->  Index Only Scan using index_projects_on_namespace_id_and_id on public.projects  (cost=0.43..3.73 rows=17 width=4) (actual time=0.092..0.093 rows=1 loops=1)
                     Index Cond: (projects.namespace_id = 3)
                     Heap Fetches: 0
                     Buffers: shared hit=4
               ->  Index Scan using index_daily_build_group_report_results_unique_columns on public.ci_daily_build_group_report_results  (cost=0.55..6.62 rows=3 width=101) (actual time=0.018..0.018 rows=0 loops=1)
                     Index Cond: ((ci_daily_build_group_report_results.project_id = projects.id) AND (ci_daily_build_group_report_results.ref_path = 'refs/heads/master'::text) AND (ci_daily_build_group_report_results.date >= '2020-08-01'::date) AND (ci_daily_build_group_report_results.date <= '2020-08-31'::date))

New Query on gitlab-org/gitlab:

SELECT "ci_daily_build_group_report_results".*
FROM
    "ci_daily_build_group_report_results"
WHERE
    "ci_daily_build_group_report_results"."project_id" IN (
        SELECT
            "projects"."id"
        FROM
            "projects"
        WHERE
            "projects"."namespace_id" = 9970
            AND "projects"."id" = 278964)
    AND "ci_daily_build_group_report_results"."ref_path" = 'refs/heads/master'
    AND "ci_daily_build_group_report_results"."date" BETWEEN '2020-03-09'
    AND '2020-03-10'
ORDER BY
    "ci_daily_build_group_report_results"."date" DESC,
    "ci_daily_build_group_report_results"."group_name" ASC
LIMIT 1000

with results from #database-lab:

 Limit  (cost=7.05..7.06 rows=1 width=101) (actual time=9.344..9.344 rows=0 loops=1)
   Buffers: shared hit=9 read=4
   I/O Timings: read=9.222
   ->  Sort  (cost=7.05..7.06 rows=1 width=101) (actual time=9.342..9.342 rows=0 loops=1)
         Sort Key: ci_daily_build_group_report_results.date DESC, ci_daily_build_group_report_results.group_name
         Sort Method: quicksort  Memory: 25kB
         Buffers: shared hit=9 read=4
         I/O Timings: read=9.222
         ->  Nested Loop Semi Join  (cost=0.99..7.04 rows=1 width=101) (actual time=9.294..9.295 rows=0 loops=1)
               Buffers: shared hit=3 read=4
               I/O Timings: read=9.222
               ->  Index Scan using index_daily_build_group_report_results_unique_columns on public.ci_daily_build_group_report_results  (cost=0.55..3.58 rows=1 width=101) (actual time=9.293..9.293 rows=0 loops=1)
                     Index Cond: ((ci_daily_build_group_report_results.project_id = 278964) AND (ci_daily_build_group_report_results.ref_path = 'refs/heads/master'::text) AND (ci_daily_build_group_report_results.date >= '2020-03-09'::date) AND (ci_daily_build_group_report_results.date <= '2020-03-10'::date))
                     Buffers: shared hit=3 read=4
                     I/O Timings: read=9.222
               ->  Index Only Scan using index_projects_on_namespace_id_and_id on public.projects  (cost=0.43..3.45 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                     Index Cond: ((projects.namespace_id = 9970) AND (projects.id = 278964))

Availability and Testing

Security

If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:

  • ~~Label as security and @ mention @gitlab-com/gl-security/appsec~~
  • The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • Security reports checked/validated by a reviewer from the AppSec team
Edited by Mayra Cabrera

Merge request reports