Group coverage project filter
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
-
Changelog entry Documentation (if required)-
Code review guidelines -
Merge request performance guidelines -
Style guides -
Database guides -
Separation of EE specific content
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
-
Review and add/update tests for this feature/bug. Consider all test levels. See the Test Planning Process. Tested in all supported browsers- ~~Informed Infrastructure department of a default or new setting change, if applicable per definition of done~~`
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 methodsSecurity reports checked/validated by a reviewer from the AppSec team
Edited by Mayra Cabrera