)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"80351586d8c452f4e4e952be59de0d7f63103509","unresolved":false,"context_lines":[{"line_number":2325,"context_line":"        if sdir \u003d\u003d \u0027desc\u0027:"},{"line_number":2326,"context_line":"            query \u003d query.order_by(desc(getattr(model, skey)))"},{"line_number":2327,"context_line":"        else:"},{"line_number":2328,"context_line":"            query \u003d query.order_by(getattr(model, skey))"},{"line_number":2329,"context_line":""},{"line_number":2330,"context_line":"        # Build a list of equivalence requirements on keys we\u0027ve already"},{"line_number":2331,"context_line":"        # processed through the loop. In other words, if we\u0027re adding"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_2745fb43","line":2328,"range":{"start_line":2328,"start_character":35,"end_line":2328,"end_character":55},"updated":"2017-10-06 22:07:31.000000000","message":"oslo.db specifically uses the asc function here:\n\nhttps://github.com/openstack/oslo.db/blob/master/oslo_db/sqlalchemy/utils.py#L207\n\nI guess just to be specific and not assume asc is the natural sort order?","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b53bc188dce6e9b3357c590e70ba4eb25a266a14","unresolved":false,"context_lines":[{"line_number":2325,"context_line":"        if sdir \u003d\u003d \u0027desc\u0027:"},{"line_number":2326,"context_line":"            query \u003d query.order_by(desc(getattr(model, skey)))"},{"line_number":2327,"context_line":"        else:"},{"line_number":2328,"context_line":"            query \u003d query.order_by(getattr(model, skey))"},{"line_number":2329,"context_line":""},{"line_number":2330,"context_line":"        # Build a list of equivalence requirements on keys we\u0027ve already"},{"line_number":2331,"context_line":"        # processed through the loop. In other words, if we\u0027re adding"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_877dcf1d","line":2328,"range":{"start_line":2328,"start_character":35,"end_line":2328,"end_character":55},"in_reply_to":"7f515b1d_2745fb43","updated":"2017-10-06 22:15:09.000000000","message":"I dunno, I can\u0027t imagine why that is, and note that the old code here didn\u0027t use asc. But I can change it for symmetry if you want.","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"80351586d8c452f4e4e952be59de0d7f63103509","unresolved":false,"context_lines":[{"line_number":2346,"context_line":"            # If we\u0027re not the last key, then strict greater or less than"},{"line_number":2347,"context_line":"            # so we order strictly."},{"line_number":2348,"context_line":"            if sdir \u003d\u003d \u0027asc\u0027:"},{"line_number":2349,"context_line":"                crit \u003d (getattr(model, skey) \u003e val)"},{"line_number":2350,"context_line":"            else:"},{"line_number":2351,"context_line":"                crit \u003d (getattr(model, skey) \u003c val)"},{"line_number":2352,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_475477ca","line":2349,"range":{"start_line":2349,"start_character":23,"end_line":2349,"end_character":51},"updated":"2017-10-06 22:07:31.000000000","message":"Looks like we need to account for sort keys that are booleans?\n\nhttps://github.com/openstack/oslo.db/blob/master/oslo_db/sqlalchemy/utils.py#L248\n\nFor example, the locked field - although looking at the API schema I guess you can\u0027t sort by the locked field:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/servers.py#L291\n\nBut you can sort by auto_disk_config which is a boolean:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/servers.py#L298","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b53bc188dce6e9b3357c590e70ba4eb25a266a14","unresolved":false,"context_lines":[{"line_number":2346,"context_line":"            # If we\u0027re not the last key, then strict greater or less than"},{"line_number":2347,"context_line":"            # so we order strictly."},{"line_number":2348,"context_line":"            if sdir \u003d\u003d \u0027asc\u0027:"},{"line_number":2349,"context_line":"                crit \u003d (getattr(model, skey) \u003e val)"},{"line_number":2350,"context_line":"            else:"},{"line_number":2351,"context_line":"                crit \u003d (getattr(model, skey) \u003c val)"},{"line_number":2352,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_6778932a","line":2349,"range":{"start_line":2349,"start_character":23,"end_line":2349,"end_character":51},"in_reply_to":"7f515b1d_475477ca","updated":"2017-10-06 22:15:09.000000000","message":"Ack, I didn\u0027t look close but thought we were good here.","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e900ac0ae859b5714b81f6f6b84ff578b2300012","unresolved":false,"context_lines":[{"line_number":2342,"context_line":"                (getattr(model, sort_keys[equal_attr]) \u003d\u003d values[equal_attr]))"},{"line_number":2343,"context_line":""},{"line_number":2344,"context_line":"        model_attr \u003d getattr(model, skey)"},{"line_number":2345,"context_line":"        if isinstance(model_attr.type, Boolean):"},{"line_number":2346,"context_line":"            model_attr \u003d cast(model_attr, Integer)"},{"line_number":2347,"context_line":"            val \u003d int(val)"},{"line_number":2348,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7f515b1d_6a6e1a97","line":2345,"updated":"2017-10-06 22:52:30.000000000","message":"Yup, removing this cast gives you this fun error:\n\nsqlalchemy.exc.ArgumentError: Only \u0027\u003d\u0027, \u0027!\u003d\u0027, \u0027is_()\u0027, \u0027isnot()\u0027, \u0027is_distinct_from()\u0027, \u0027isnot_distinct_from()\u0027 operators can be used with None/True/False","commit_id":"95face9363e87b33b8dbae46a96c98b39574ba7e"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"80351586d8c452f4e4e952be59de0d7f63103509","unresolved":false,"context_lines":[{"line_number":10804,"context_line":"            db_instance \u003d db.instance_create(self.context, inst)"},{"line_number":10805,"context_line":"            self.instances.append(db_instance)"},{"line_number":10806,"context_line":""},{"line_number":10807,"context_line":"    def test_thing(self):"},{"line_number":10808,"context_line":"        # Pull out the first instance sorted by our desired key"},{"line_number":10809,"context_line":"        first \u003d db.instance_get_all_by_filters_sort(self.context, {}, limit\u003d1,"},{"line_number":10810,"context_line":"                                                    sort_keys\u003d[\u0027memory_mb\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_d56c9409","side":"PARENT","line":10807,"range":{"start_line":10807,"start_character":8,"end_line":10807,"end_character":18},"updated":"2017-10-06 22:07:31.000000000","message":"Is there value in testing with a single sort key?","commit_id":"e4f89ed5dd4259188d020749fa8fb1c77be2c03a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b53bc188dce6e9b3357c590e70ba4eb25a266a14","unresolved":false,"context_lines":[{"line_number":10804,"context_line":"            db_instance \u003d db.instance_create(self.context, inst)"},{"line_number":10805,"context_line":"            self.instances.append(db_instance)"},{"line_number":10806,"context_line":""},{"line_number":10807,"context_line":"    def test_thing(self):"},{"line_number":10808,"context_line":"        # Pull out the first instance sorted by our desired key"},{"line_number":10809,"context_line":"        first \u003d db.instance_get_all_by_filters_sort(self.context, {}, limit\u003d1,"},{"line_number":10810,"context_line":"                                                    sort_keys\u003d[\u0027memory_mb\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_679d3356","side":"PARENT","line":10807,"range":{"start_line":10807,"start_character":8,"end_line":10807,"end_character":18},"in_reply_to":"7f515b1d_d56c9409","updated":"2017-10-06 22:15:09.000000000","message":"We cover it pretty completely in the functional tests. It\u0027s not an easy change to this one (the 2/3 variants sort the same way but only one key will sort different from this example).","commit_id":"e4f89ed5dd4259188d020749fa8fb1c77be2c03a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"80351586d8c452f4e4e952be59de0d7f63103509","unresolved":false,"context_lines":[{"line_number":10805,"context_line":"            db_instance \u003d db.instance_create(self.context, inst)"},{"line_number":10806,"context_line":"            self.instances.append(db_instance)"},{"line_number":10807,"context_line":""},{"line_number":10808,"context_line":"    def _test_with_multiple_keys(self, sort_keys, sort_dirs, value_fn):"},{"line_number":10809,"context_line":"        \"\"\"Test instance_get_by_sort_filters() with multiple sort keys."},{"line_number":10810,"context_line":""},{"line_number":10811,"context_line":"        Since this returns the marker it\u0027s looking for, it\u0027s actually really"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_950dfc3f","line":10808,"range":{"start_line":10808,"start_character":39,"end_line":10808,"end_character":69},"updated":"2017-10-06 22:07:31.000000000","message":"These aren\u0027t used...","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b53bc188dce6e9b3357c590e70ba4eb25a266a14","unresolved":false,"context_lines":[{"line_number":10805,"context_line":"            db_instance \u003d db.instance_create(self.context, inst)"},{"line_number":10806,"context_line":"            self.instances.append(db_instance)"},{"line_number":10807,"context_line":""},{"line_number":10808,"context_line":"    def _test_with_multiple_keys(self, sort_keys, sort_dirs, value_fn):"},{"line_number":10809,"context_line":"        \"\"\"Test instance_get_by_sort_filters() with multiple sort keys."},{"line_number":10810,"context_line":""},{"line_number":10811,"context_line":"        Since this returns the marker it\u0027s looking for, it\u0027s actually really"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_078f9f23","line":10808,"range":{"start_line":10808,"start_character":39,"end_line":10808,"end_character":69},"in_reply_to":"7f515b1d_950dfc3f","updated":"2017-10-06 22:15:09.000000000","message":"Yeah sorry I refactored the test after manually hacking in the variants and clearly didn\u0027t get it finished :)","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"80351586d8c452f4e4e952be59de0d7f63103509","unresolved":false,"context_lines":[{"line_number":10864,"context_line":"    def test_with_two_keys(self):"},{"line_number":10865,"context_line":"        \"\"\"Test instance_get_by_sort_filters() with two sort_keys.\"\"\""},{"line_number":10866,"context_line":"        self._test_with_multiple_keys("},{"line_number":10867,"context_line":"            [\u0027memory_mb\u0027, \u0027key_name\u0027],"},{"line_number":10868,"context_line":"            [\u0027asc\u0027, \u0027desc\u0027],"},{"line_number":10869,"context_line":"            lambda mem, name: [mem, name])"},{"line_number":10870,"context_line":""},{"line_number":10871,"context_line":"    def test_with_three_keys(self):"},{"line_number":10872,"context_line":"        \"\"\"Test instance_get_by_sort_filters() with three sort_keys."}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_7508402c","line":10869,"range":{"start_line":10867,"start_character":12,"end_line":10869,"end_character":41},"updated":"2017-10-06 22:07:31.000000000","message":"these aren\u0027t used","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"80351586d8c452f4e4e952be59de0d7f63103509","unresolved":false,"context_lines":[{"line_number":10879,"context_line":"        a key in the middle of sort_keys."},{"line_number":10880,"context_line":"        \"\"\""},{"line_number":10881,"context_line":"        self._test_with_multiple_keys("},{"line_number":10882,"context_line":"            [\u0027memory_mb\u0027, \u0027vcpus\u0027, \u0027key_name\u0027],"},{"line_number":10883,"context_line":"            [\u0027asc\u0027, \u0027asc\u0027, \u0027desc\u0027],"},{"line_number":10884,"context_line":"            lambda mem, name: [mem, 1, name])"},{"line_number":10885,"context_line":""},{"line_number":10886,"context_line":"    def test_no_match(self):"},{"line_number":10887,"context_line":"        marker \u003d db.instance_get_by_sort_filters(self.context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_07ff9f01","line":10884,"range":{"start_line":10882,"start_character":12,"end_line":10884,"end_character":44},"updated":"2017-10-06 22:07:31.000000000","message":"these aren\u0027t used, and this is essentially what it\u0027s testing anyway right?","commit_id":"e629063f5c40bf4a4fbb15c4a039e2f51c8dbbe7"}]}
