)]}'
{"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"2a694b30c4ccbf3d7481f3c6156b4341ec48ff1a","unresolved":false,"context_lines":[{"line_number":1091,"context_line":"        :param provision_state: Optional string value to get only nodes in"},{"line_number":1092,"context_line":"                                that provision state."},{"line_number":1093,"context_line":"        :param name_wildcard: Optional string value to get nodes by wildcard"},{"line_number":1094,"context_line":"                              of node name."},{"line_number":1095,"context_line":"        :param marker: pagination marker for large data sets."},{"line_number":1096,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":1097,"context_line":"        :param sort_key: column to sort results by. Default: id."}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_03fb9548","line":1094,"updated":"2016-05-02 22:24:25.000000000","message":"Can you add notes to the docstrings and commit indicating that this is a SQL wildcard? I originally assumed that this was something like regexp matching until I saw the code.","commit_id":"a1ab61b48570dd1632384a2cd15fc9943db25362"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e03648448b54baecc61c378a3cf9498152062f5d","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        if \u0027provision_state\u0027 in filters:"},{"line_number":213,"context_line":"            query \u003d query.filter_by(provision_state\u003dfilters[\u0027provision_state\u0027])"},{"line_number":214,"context_line":"        if \u0027name_wildcard\u0027 in filters:"},{"line_number":215,"context_line":"            column_attr \u003d getattr(models.Node, \u0027name\u0027)"},{"line_number":216,"context_line":"            query \u003d query.filter(column_attr.op(\u0027LIKE\u0027)("},{"line_number":217,"context_line":"                                 u\u0027%\u0027 + filters[\u0027name_wildcard\u0027] + u\u0027%\u0027))"},{"line_number":218,"context_line":"        if \u0027provisioned_before\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_58b6b9f9","line":215,"updated":"2016-04-26 09:10:34.000000000","message":"Why not simple models.Node.name?","commit_id":"0b63a38891fea8e6bf962d5dabe883739bcb589e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1ce1f6f2c6dfc09e650d5c9b3ae55bb25ff08bd9","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        if \u0027provision_state\u0027 in filters:"},{"line_number":213,"context_line":"            query \u003d query.filter_by(provision_state\u003dfilters[\u0027provision_state\u0027])"},{"line_number":214,"context_line":"        if \u0027name_wildcard\u0027 in filters:"},{"line_number":215,"context_line":"            column_attr \u003d getattr(models.Node, \u0027name\u0027)"},{"line_number":216,"context_line":"            query \u003d query.filter(column_attr.op(\u0027LIKE\u0027)("},{"line_number":217,"context_line":"                                 u\u0027%\u0027 + filters[\u0027name_wildcard\u0027] + u\u0027%\u0027))"},{"line_number":218,"context_line":"        if \u0027provisioned_before\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_4755224e","line":215,"in_reply_to":"1a122d0e_58b6b9f9","updated":"2016-04-27 03:21:28.000000000","message":"Do you mean  getattr(models.Node.name) ?? This is not working, because the 2nd parameter of field name is required.\n\nAnd do you want to reference models.Node.name directly, that is the value, not column attr, so can not used directly to construct the LIKE filter, any more ideas?","commit_id":"0b63a38891fea8e6bf962d5dabe883739bcb589e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e03648448b54baecc61c378a3cf9498152062f5d","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        if \u0027name_wildcard\u0027 in filters:"},{"line_number":215,"context_line":"            column_attr \u003d getattr(models.Node, \u0027name\u0027)"},{"line_number":216,"context_line":"            query \u003d query.filter(column_attr.op(\u0027LIKE\u0027)("},{"line_number":217,"context_line":"                                 u\u0027%\u0027 + filters[\u0027name_wildcard\u0027] + u\u0027%\u0027))"},{"line_number":218,"context_line":"        if \u0027provisioned_before\u0027 in filters:"},{"line_number":219,"context_line":"            limit \u003d (timeutils.utcnow() -"},{"line_number":220,"context_line":"                     datetime.timedelta(seconds\u003dfilters[\u0027provisioned_before\u0027]))"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_6c0bfa24","line":217,"updated":"2016-04-26 09:10:34.000000000","message":"This default behavior with adding special symbol % at the start and the end of wildcard not mentioned in the spec. Yes, this symbol in url can be unsafe, but this gluing should not be done on the DB api level at least.","commit_id":"0b63a38891fea8e6bf962d5dabe883739bcb589e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1ce1f6f2c6dfc09e650d5c9b3ae55bb25ff08bd9","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        if \u0027name_wildcard\u0027 in filters:"},{"line_number":215,"context_line":"            column_attr \u003d getattr(models.Node, \u0027name\u0027)"},{"line_number":216,"context_line":"            query \u003d query.filter(column_attr.op(\u0027LIKE\u0027)("},{"line_number":217,"context_line":"                                 u\u0027%\u0027 + filters[\u0027name_wildcard\u0027] + u\u0027%\u0027))"},{"line_number":218,"context_line":"        if \u0027provisioned_before\u0027 in filters:"},{"line_number":219,"context_line":"            limit \u003d (timeutils.utcnow() -"},{"line_number":220,"context_line":"                     datetime.timedelta(seconds\u003dfilters[\u0027provisioned_before\u0027]))"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_a7c196e6","line":217,"in_reply_to":"1a122d0e_6c0bfa24","updated":"2016-04-27 03:21:28.000000000","message":"I searched sqlalchemy official doc about how to run \u0027LIKE\u0027 query [1] , almost like current code, have to add two \u0027%\u0027 symbols, so if we can have better way to implement, will do.\n\n[1] http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html","commit_id":"0b63a38891fea8e6bf962d5dabe883739bcb589e"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2b12d9ab6785c7415777c20388a19c09e71b1edf","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        if \u0027name_wildcard\u0027 in filters:"},{"line_number":215,"context_line":"            column_attr \u003d getattr(models.Node, \u0027name\u0027)"},{"line_number":216,"context_line":"            query \u003d query.filter(column_attr.op(\u0027LIKE\u0027)("},{"line_number":217,"context_line":"                                 u\u0027%\u0027 + filters[\u0027name_wildcard\u0027] + u\u0027%\u0027))"},{"line_number":218,"context_line":"        if \u0027provisioned_before\u0027 in filters:"},{"line_number":219,"context_line":"            limit \u003d (timeutils.utcnow() -"},{"line_number":220,"context_line":"                     datetime.timedelta(seconds\u003dfilters[\u0027provisioned_before\u0027]))"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_afc9e07b","line":217,"updated":"2016-05-03 01:23:48.000000000","message":"Mario is correct - with this db implementation, the API will always wildcard both sides of the provided string.","commit_id":"a1ab61b48570dd1632384a2cd15fc9943db25362"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"2a694b30c4ccbf3d7481f3c6156b4341ec48ff1a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        if \u0027name_wildcard\u0027 in filters:"},{"line_number":215,"context_line":"            column_attr \u003d getattr(models.Node, \u0027name\u0027)"},{"line_number":216,"context_line":"            query \u003d query.filter(column_attr.op(\u0027LIKE\u0027)("},{"line_number":217,"context_line":"                                 u\u0027%\u0027 + filters[\u0027name_wildcard\u0027] + u\u0027%\u0027))"},{"line_number":218,"context_line":"        if \u0027provisioned_before\u0027 in filters:"},{"line_number":219,"context_line":"            limit \u003d (timeutils.utcnow() -"},{"line_number":220,"context_line":"                     datetime.timedelta(seconds\u003dfilters[\u0027provisioned_before\u0027]))"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_c35cfd4e","line":217,"updated":"2016-05-02 22:24:25.000000000","message":"This may be my ignorance, but is there a reason we need to surround this with %? I think this allows for some strange behavior.\n\nIf I wanted to run a query like \"test-%\" (return all nodes with names beginning with \"test-\"), I think this would also return a node with the name \"not-a-test-01\" because of the % at the beginning.","commit_id":"a1ab61b48570dd1632384a2cd15fc9943db25362"}],"ironic/tests/unit/api/v1/test_nodes.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e03648448b54baecc61c378a3cf9498152062f5d","unresolved":false,"context_lines":[{"line_number":869,"context_line":"        mock_vdi.assert_called_once_with(mock.ANY, node.uuid, \u0027test-topic\u0027)"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"    def test_name_wildcard_node(self):"},{"line_number":872,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":873,"context_line":"                                          uuid\u003duuidutils.generate_uuid(),"},{"line_number":874,"context_line":"                                          name\u003d\u0027node-01\u0027)"},{"line_number":875,"context_line":"        data \u003d self.get_json(\u0027/nodes?name_wildcard\u003dnode-0%\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_f8bb450d","line":872,"updated":"2016-04-26 09:10:34.000000000","message":"Please create one additional node that not correspond to wildcard.","commit_id":"0b63a38891fea8e6bf962d5dabe883739bcb589e"},{"author":{"_account_id":7933,"name":"Philippe Godin","email":"godp1301@gmail.com","username":"godp1301"},"change_message_id":"db76d63463b3e2a621728fe210540727a78cff5f","unresolved":false,"context_lines":[{"line_number":869,"context_line":"        mock_vdi.assert_called_once_with(mock.ANY, node.uuid, \u0027test-topic\u0027)"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"    def test_name_wildcard_node(self):"},{"line_number":872,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":873,"context_line":"                                          uuid\u003duuidutils.generate_uuid(),"},{"line_number":874,"context_line":"                                          name\u003d\u0027node-01\u0027)"},{"line_number":875,"context_line":"        data \u003d self.get_json(\u0027/nodes?name_wildcard\u003dnode-0%\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_361e6970","line":872,"in_reply_to":"1a122d0e_f8bb450d","updated":"2016-04-26 13:20:54.000000000","message":"+1","commit_id":"0b63a38891fea8e6bf962d5dabe883739bcb589e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1ce1f6f2c6dfc09e650d5c9b3ae55bb25ff08bd9","unresolved":false,"context_lines":[{"line_number":869,"context_line":"        mock_vdi.assert_called_once_with(mock.ANY, node.uuid, \u0027test-topic\u0027)"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"    def test_name_wildcard_node(self):"},{"line_number":872,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":873,"context_line":"                                          uuid\u003duuidutils.generate_uuid(),"},{"line_number":874,"context_line":"                                          name\u003d\u0027node-01\u0027)"},{"line_number":875,"context_line":"        data \u003d self.get_json(\u0027/nodes?name_wildcard\u003dnode-0%\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_4727e211","line":872,"in_reply_to":"1a122d0e_f8bb450d","updated":"2016-04-27 03:21:28.000000000","message":"Done","commit_id":"0b63a38891fea8e6bf962d5dabe883739bcb589e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"2a694b30c4ccbf3d7481f3c6156b4341ec48ff1a","unresolved":false,"context_lines":[{"line_number":878,"context_line":"                                   name\u003d\u0027node-02\u0027)"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        data \u003d self.get_json(\u0027/nodes?name_wildcard\u003dnode-0%\u0027)"},{"line_number":881,"context_line":"        self.assertEqual(node_1.uuid, data[\u0027nodes\u0027][0][\u0027uuid\u0027])"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def test_name_wildcard_node_with_non_existent_name(self):"},{"line_number":884,"context_line":"        obj_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_36724db1","line":881,"updated":"2016-05-02 22:24:25.000000000","message":"Is the order guaranteed here? I\u0027m not sure that SQL explicitly is guaranteed to sort the results unless there\u0027s an ORDER BY clause.","commit_id":"a1ab61b48570dd1632384a2cd15fc9943db25362"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"2a694b30c4ccbf3d7481f3c6156b4341ec48ff1a","unresolved":false,"context_lines":[{"line_number":885,"context_line":"                                   uuid\u003duuidutils.generate_uuid(),"},{"line_number":886,"context_line":"                                   name\u003d\u0027node-01\u0027)"},{"line_number":887,"context_line":"        data \u003d self.get_json(\u0027/nodes?name_wildcard\u003dnode-02\u0027)"},{"line_number":888,"context_line":"        self.assertThat(data[\u0027nodes\u0027], HasLength(0))"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"class TestPatch(test_api_base.BaseApiTest):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_435e2d7a","line":888,"updated":"2016-05-02 22:24:25.000000000","message":"Can we add a few more test cases here? \n\nMaybe test matches for a single character as well as matching for wildcards at the beginning, middle, and end of the node name.","commit_id":"a1ab61b48570dd1632384a2cd15fc9943db25362"}],"releasenotes/notes/node-name-wildcard-9fbd723197a53145.yaml":[{"author":{"_account_id":19686,"name":"Ramamani Yeleswarapu","email":"ramamani.yeleswarapu@intel.com","username":"Rama_Y"},"change_message_id":"91283df248ea1712d5c130c366b46ad963a484d9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - In this patch, will add a new api,"},{"line_number":4,"context_line":"    \u0027/v1/nodes/?name_wildcard\u003d\u003cwildcard_str\u003e\u0027,"},{"line_number":5,"context_line":"    it supports to filter nodes by name wildcard string."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"1a122d0e_d831f6a3","line":5,"range":{"start_line":3,"start_character":0,"end_line":5,"end_character":56},"updated":"2016-04-27 20:54:40.000000000","message":"I would like to suggest writing it this way:\n\n- Adds a new API \u0027/v1/nodes/?name_wildcard\u003d\u003cwildcard_str\u003e\u0027,\n  which supports fitering nodes by name_wildcard string.","commit_id":"8e1019fcbca045f2e590acb9b13f8567f8676b05"}]}
