)]}'
{"keystone/resource/backends/sql.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6073d59538c2aa0e25e48cff07aa642126cd4046","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def _inexact_filter(self, query, filters):"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        if filters[\u0027comparator\u0027] \u003d\u003d \u0027contains\u0027:"},{"line_number":224,"context_line":"            term \u003d ProjectTag.name.ilike(\u0027%%%s%%\u0027 % filters[\u0027value\u0027])"},{"line_number":225,"context_line":"        elif filters[\u0027comparator\u0027] \u003d\u003d \u0027startswith\u0027:"},{"line_number":226,"context_line":"            term \u003d ProjectTag.name.ilike(\u0027%s%%\u0027 % filters[\u0027value\u0027])"},{"line_number":227,"context_line":"        elif filters[\u0027comparator\u0027] \u003d\u003d \u0027endswith\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_cfa9dd90","line":224,"range":{"start_line":223,"start_character":8,"end_line":224,"end_character":69},"updated":"2018-03-19 16:57:04.000000000","message":"This is a bad filter for MySQL based systems, it is very expensive (and a full table scan, you cannot index) because it is a leading wild-card.\n\nI am not sure we should have contains or endswith based upon the potential cost if a lot of tags in the db. It can get expensive to have the full table scan as the table increases in size.","commit_id":"2a2a895b8f19ade9d09ba3bedffcd12c0ebde90d"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6073d59538c2aa0e25e48cff07aa642126cd4046","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            term \u003d ProjectTag.name.ilike(\u0027%%%s%%\u0027 % filters[\u0027value\u0027])"},{"line_number":225,"context_line":"        elif filters[\u0027comparator\u0027] \u003d\u003d \u0027startswith\u0027:"},{"line_number":226,"context_line":"            term \u003d ProjectTag.name.ilike(\u0027%s%%\u0027 % filters[\u0027value\u0027])"},{"line_number":227,"context_line":"        elif filters[\u0027comparator\u0027] \u003d\u003d \u0027endswith\u0027:"},{"line_number":228,"context_line":"            term \u003d ProjectTag.name.ilike(\u0027%%%s\u0027 % filters[\u0027value\u0027])"},{"line_number":229,"context_line":"        else:"},{"line_number":230,"context_line":"            # It\u0027s a filter we don\u0027t understand, so let the caller"},{"line_number":231,"context_line":"            # work out if they need to do something with it."}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_efae2197","line":228,"range":{"start_line":227,"start_character":8,"end_line":228,"end_character":67},"updated":"2018-03-19 16:57:04.000000000","message":"See above.","commit_id":"2a2a895b8f19ade9d09ba3bedffcd12c0ebde90d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"03b84b03bab31a3e4f9102f90e518e7223f62f3f","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        return subq"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def _inexact_filter(self, query, filters):"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        if filters[\u0027comparator\u0027] \u003d\u003d \u0027contains\u0027:"},{"line_number":230,"context_line":"            term \u003d ProjectTag.name.ilike(\u0027%%%s%%\u0027 % filters[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_cbb15291","line":227,"updated":"2018-04-12 03:40:33.000000000","message":"This feels like it should live in the manager, since it\u0027s seems more like business logic.","commit_id":"c3a77ba5a4309f42539922afd978ce6fa6ec6151"}],"keystone/resource/controllers.py":[{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"26aac311a87b7cd5798f1ffb4e5d614579bdbc02","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        # False (which in query terms means \u00270\u0027)"},{"line_number":193,"context_line":"        if \u0027is_domain\u0027 not in request.params:"},{"line_number":194,"context_line":"            hints.add_filter(\u0027is_domain\u0027, \u00270\u0027)"},{"line_number":195,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"},{"line_number":196,"context_line":"        return ProjectV3.wrap_collection(request.context_dict,"},{"line_number":197,"context_line":"                                         refs, hints\u003dhints)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_5a4e51c1","line":195,"range":{"start_line":195,"start_character":15,"end_line":195,"end_character":32},"updated":"2018-03-15 00:06:34.000000000","message":"Change this back to PROVIDERS.resource_api","commit_id":"f2b8748d58315e8103b29327edd2f9fc5a50b641"}],"keystone/resource/core.py":[{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"26aac311a87b7cd5798f1ffb4e5d614579bdbc02","unresolved":false,"context_lines":[{"line_number":830,"context_line":"                if f[\u0027name\u0027] in TAG_SEARCH_FILTERS:"},{"line_number":831,"context_line":"                    hints.filters.remove(f)"},{"line_number":832,"context_line":"                    f[\u0027method\u0027] \u003d f[\u0027name\u0027]"},{"line_number":833,"context_line":"                    f[\u0027name\u0027] \u003d u\u0027name\u0027"},{"line_number":834,"context_line":"                    tag_hints.filters.append(f)"},{"line_number":835,"context_line":"            if tag_hints.filters:"},{"line_number":836,"context_line":"                tag_refs \u003d self.driver.list_projects_by_tags(tag_hints)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_bad8cdee","line":833,"range":{"start_line":833,"start_character":32,"end_line":833,"end_character":33},"updated":"2018-03-15 00:06:34.000000000","message":"Not sure if this is really needed","commit_id":"f2b8748d58315e8103b29327edd2f9fc5a50b641"}],"keystone/tests/unit/test_v3_resource.py":[{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"26aac311a87b7cd5798f1ffb4e5d614579bdbc02","unresolved":false,"context_lines":[{"line_number":731,"context_line":"    def test_list_projects_filtering_by_tags(self):"},{"line_number":732,"context_line":"        \"\"\"Call ``GET /projects?tags\u003d{tags}``.\"\"\""},{"line_number":733,"context_line":"        project, tags \u003d self._create_project_and_tags(num_of_tags\u003d2)"},{"line_number":734,"context_line":"        project1, tags1 \u003d self._create_project_and_tags(num_of_tags\u003d2)"},{"line_number":735,"context_line":"        tag_string \u003d tags[0] + \u0027,\u0027 + tags1[0]"},{"line_number":736,"context_line":"        resp \u003d self.get(\u0027/projects?tags\u003d%(values)s\u0027 % {"},{"line_number":737,"context_line":"            \u0027values\u0027: tag_string})"},{"line_number":738,"context_line":"        pids \u003d [p[\u0027id\u0027] for p in resp.result[\u0027projects\u0027]]"},{"line_number":739,"context_line":"        self.assertValidProjectListResponse(resp)"},{"line_number":740,"context_line":"        self.assertNotIn(project[\u0027id\u0027], pids)"},{"line_number":741,"context_line":"        self.assertNotIn(project1[\u0027id\u0027], pids)"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"    def test_list_projects_filtering_by_tags_any(self):"},{"line_number":744,"context_line":"        \"\"\"Call ``GET /projects?tags-any\u003d{tags}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_7aa55546","line":741,"range":{"start_line":734,"start_character":0,"end_line":741,"end_character":46},"updated":"2018-03-15 00:06:34.000000000","message":"This is asserting that GET is not returning any projects due to being self-contradictory, rather than filtering on the project by tag and returning the one we are searching for.","commit_id":"f2b8748d58315e8103b29327edd2f9fc5a50b641"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"61015612945d32c0980980f4eddddbf4458b0a63","unresolved":false,"context_lines":[{"line_number":737,"context_line":"            \u0027values\u0027: tag_string})"},{"line_number":738,"context_line":"        pids \u003d [p[\u0027id\u0027] for p in resp.result[\u0027projects\u0027]]"},{"line_number":739,"context_line":"        self.assertValidProjectListResponse(resp)"},{"line_number":740,"context_line":"        self.assertNotIn(project[\u0027id\u0027], pids)"},{"line_number":741,"context_line":"        self.assertNotIn(project1[\u0027id\u0027], pids)"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"    def test_list_projects_filtering_by_tags_any(self):"},{"line_number":744,"context_line":"        \"\"\"Call ``GET /projects?tags-any\u003d{tags}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_b9fdffb2","line":741,"range":{"start_line":740,"start_character":8,"end_line":741,"end_character":46},"updated":"2018-03-19 17:31:23.000000000","message":"I did this to differentiate between tags and tags_any tests. The tags are randomly generated so returning more than one project with tags is impossible. Meanwhile, a single parameter search has the same results using tags or tags_any. This test serves to highlight that a tags search must contain each tag rather than at least one tag (as is the case in tags_any)","commit_id":"9a93d489b5938b6abe772b76e8ecf4eac4c8aa36"}]}
