summaryrefslogtreecommitdiff
path: root/app/finders/projects_finder.rb
Commit message (Collapse)AuthorAgeFilesLines
* [Rails5] Rename `sort` methods to `sort_by_attribute`blackst0ne2018-04-041-1/+1
|
* Support custom attributes on projectsMarkus Koller2017-11-061-0/+3
|
* Removes default scope from sortable23079-remove-default-scope-in-sortableTiago Botelho2017-09-071-1/+1
|
* Add an option to list only archived projectsMehdi Lahmam2017-08-241-4/+13
| | | | Closes #35994
* Add user projects APIvanadium232017-07-061-1/+8
|
* Refactor GroupProjectsFinder#init_collectionYorick Peterse2017-06-191-17/+1
| | | | | | This optimises how GroupProjectsFinder builds it collection, producing simpler and faster queries in the process. It also cleans up the code a bit to make it easier to understand.
* Refactor ProjectsFinder#init_collectionYorick Peterse2017-06-161-19/+57
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This changes ProjectsFinder#init_collection so it no longer relies on a UNION. For example, to get starred projects of a user we used to run: SELECT projects.* FROM projects WHERE projects.pending_delete = 'f' AND ( projects.id IN ( SELECT projects.id FROM projects INNER JOIN users_star_projects ON users_star_projects.project_id = projects.id INNER JOIN project_authorizations ON projects.id = project_authorizations.project_id WHERE projects.pending_delete = 'f' AND project_authorizations.user_id = 1 AND users_star_projects.user_id = 1 UNION SELECT projects.id FROM projects INNER JOIN users_star_projects ON users_star_projects.project_id = projects.id WHERE projects.visibility_level IN (20, 10) AND users_star_projects.user_id = 1 ) ) ORDER BY projects.id DESC; With these changes the above query is turned into the following instead: SELECT projects.* FROM projects INNER JOIN users_star_projects ON users_star_projects.project_id = projects.id WHERE projects.pending_delete = 'f' AND ( EXISTS ( SELECT 1 FROM project_authorizations WHERE project_authorizations.user_id = 1 AND (project_id = projects.id) ) OR projects.visibility_level IN (20,10) ) AND users_star_projects.user_id = 1 ORDER BY projects.id DESC; This query in turn produces a better execution plan and takes less time, though the difference is only a few milliseconds (this however depends on the amount of data involved and additional conditions that may be added).
* Add :owned param to ProjectFinderToon Claes2017-05-301-2/+7
| | | | And use it in the API.
* Make it possible to combine :trending with other paramsToon Claes2017-05-301-6/+7
| | | | | Now it is possible to combine the :non_public parameter. This might be useful when a user wants to know the trending projects they are member of.
* UNION of SELECT/WHERE is faster than WHERE on UNIONToon Claes2017-05-301-8/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of applying WHERE on a UNION, apply the WHERE on each of the seperate SELECT statements, and do UNION on that. Local tests with about 2_000_000 projects: - 1_500_000 private projects - 40_000 internal projects - 400_000 public projects For the API endpoint `/api/v4/projects?visibility=private` the slowest query was: ```sql SELECT "projects".* FROM "projects" WHERE ... ``` The original query took 1073.8ms. The query refactored to UNION of SELECT/WHERE took 2.3ms. The original query was: ```sql SELECT "projects".* FROM "projects" WHERE "projects"."pending_delete" = $1 AND (projects.id IN (SELECT "projects"."id" FROM "projects" INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id" WHERE "projects"."pending_delete" = 'f' AND "project_authorizations"."user_id" = 23 UNION SELECT "projects"."id" FROM "projects" WHERE "projects"."visibility_level" IN (20, 10))) AND "projects"."visibility_level" = $2 AND "projects"."archived" = $3 ORDER BY "projects"."created_at" DESC LIMIT 20 OFFSET 0 [["pending_delete", "f"], ["visibility_level", 0], ["archived", "f"]] ``` The refactored query: ```sql SELECT "projects".* FROM "projects" WHERE "projects"."pending_delete" = $1 AND (projects.id IN (SELECT "projects"."id" FROM "projects" INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id" WHERE "projects"."pending_delete" = 'f' AND "project_authorizations"."user_id" = 23 AND "projects"."visibility_level" = 0 AND "projects"."archived" = 'f' UNION SELECT "projects"."id" FROM "projects" WHERE "projects"."visibility_level" IN (20, 10) AND "projects"."visibility_level" = 0 AND "projects"."archived" = 'f')) ORDER BY "projects"."created_at" DESC LIMIT 20 OFFSET 0 [["pending_delete", "f"]] ```
* Change ProjectFinder so starred can be combined with other filtersToon Claes2017-05-301-2/+5
| | | | | The `starred` parameter couldn't be used in combination with `trending` or `non_public`. But this is changed now.
* ProjectsFinder should handle more optionsJacopo2017-04-061-7/+81
| | | | | | | | | | | | | | | | | | | Extended ProjectFinder in order to handle the following options: - current_user - which user use - project_ids_relation: int[] - project ids to use - params: - trending: boolean - non_public: boolean - starred: boolean - sort: string - visibility_level: int - tags: string[] - personal: boolean - search: string - non_archived: boolean GroupProjectsFinder now inherits from ProjectsFinder. Changed the code in order to use the new available options.
* Store group and project full name and full path in routes tabledz-refactor-full-pathDmitriy Zaporozhets2017-02-081-1/+1
| | | | Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
* Pass project IDs relation to ProjectsFinder instead of using a blockAhmad Sherif2016-08-151-2/+2
|
* Speed up todos queries by limiting the projects set we join withAhmad Sherif2016-08-151-1/+2
| | | | Closes #20828
* Tweaks, refactoring, and specsDouwe Maan2016-03-201-70/+7
|
* Improve external users featureZeger-Jan van de Weg2016-03-141-2/+2
|
* Merge branch 'master' into 4009-external-usersZeger-Jan van de Weg2016-03-141-8/+6
|\
| * Merge branch 'share-project-ce' into 'master' Dmitriy Zaporozhets2016-03-141-1/+2
| |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Bring from EE: Share Project with Group - [x] Models and migrations - [x] Logic, UI - [x] Tests - [x] Documentation - [x] Share with group lock - [x] Api feature - [x] Api docs - [x] Api tests Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> For #12831 cc @DouweM @rspeicher @vsizov See merge request !3186
| | * Add finders logic and tests for shared projects featureDmitriy Zaporozhets2016-03-111-1/+2
| | | | | | | | | | | | Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
* | | Create an external users tab on Admin user listZeger-Jan van de Weg2016-03-131-4/+9
| | | | | | | | | | | | Also incorporates the review into this, mainly spec changes.
* | | External UsersZeger-Jan van de Weg2016-03-131-6/+5
|/ / | | | | | | | | The user has the rights of a public user execpt it can never create a project, group, or team. Also it cant view internal projects.
* | Removed User#project_relationsprojects-finder-ee-compatibleYorick Peterse2016-03-121-1/+1
| | | | | | | | | | | | | | | | GitLab EE adds an extra relation that selects a "project_id" column instead of an "id" column, making it very hard for this method to be re-used in EE. Since using User#authorized_groups in ProjectsFinder#all_groups apparently has no performance impact we can just use it and keep everything compatible with EE.
* | Clean up ProjectsFinder for getting user projectsYorick Peterse2016-03-111-1/+4
|/ | | | | We don't need the extra layer of nesting of UNION queries here (as User#authorized_projects already returns a UNION'd query).
* Port GitLab EE ProjectsFinder changesgitlab-ee-d39de0ea-backportYorick Peterse2015-11-201-5/+5
| | | | | | | These changes were added in GitLab EE commit d39de0ea91b26b8840195e5674b92c353cc16661. The tests were a bit bugged (they used a non existing group, thus not testing a crucial part) which I only noticed when porting CE changes to EE.
* Refactor ProjectsFinder to not pluck IDsYorick Peterse2015-11-181-67/+54
| | | | | | | | | | | | | | | | | | | This class now uses a UNION (when needed) instead of plucking tens of thousands of project IDs into memory. The tests have also been re-written to ensure all different use cases are tested properly (assuming I didn't forget any cases). The finder has also been broken up into 3 different finder classes: * ContributedProjectsFinder: class for getting the projects a user contributed to. * PersonalProjectsFinder: class for getting the personal projects of a user. * ProjectsFinder: class for getting generic projects visible to a given user. Previously a lot of the logic of these finders was handled directly in the users controller.
* Fix finder and tests for new membership modelsDmitriy Zaporozhets2014-09-151-1/+1
| | | | Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
* Huge replace of old users_project and users_group referencesDmitriy Zaporozhets2014-09-141-4/+2
| | | | Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
* Refactor some search scopes to prevent wierd behaviour and PG::Error issuesDmitriy Zaporozhets2014-06-051-4/+32
| | | | Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
* Move services for collecting items to FindersDmitriy Zaporozhets2014-02-251-0/+63
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>