)]}'
{"nova/compute/instance_list.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff8dac6630b469a5cc471f2015a03d01195f9914","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class CrossCellLister(object):"},{"line_number":89,"context_line":"    def __init__(self, sort_ctx):"},{"line_number":90,"context_line":"        self.sort_ctx \u003d sort_ctx"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_1dade4e9","line":88,"updated":"2017-11-30 17:08:24.000000000","message":"Make this an ABC?","commit_id":"9a29bc47efec80c5d87e10d42b51f44c51d8d20a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff8dac6630b469a5cc471f2015a03d01195f9914","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def __init__(self, sort_ctx):"},{"line_number":90,"context_line":"        self.sort_ctx \u003d sort_ctx"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def get_marker_record(self, ctx, marker_id):"},{"line_number":93,"context_line":"        pass"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get_marker_by_values(self, ctx, values):"},{"line_number":96,"context_line":"        pass"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def get_by_filters(self, ctx, filters, limit, marker, **kwargs):"},{"line_number":99,"context_line":"        pass"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def get_records_sorted(self, ctx, filters, limit, marker,"},{"line_number":102,"context_line":"                           **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_fdb3604c","line":99,"range":{"start_line":92,"start_character":4,"end_line":99,"end_character":12},"updated":"2017-11-30 17:08:24.000000000","message":"make these abstractmethods?","commit_id":"9a29bc47efec80c5d87e10d42b51f44c51d8d20a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova import exception"},{"line_number":21,"context_line":"from nova import objects"},{"line_number":22,"context_line":"from nova.objects import instance as instance_obj"},{"line_number":23,"context_line":"import six"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RecordSortContext(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_4e3f3087","line":23,"updated":"2017-11-30 18:54:30.000000000","message":"tsk tsk, this is a 3rd party import but you\u0027ve got it in the nova imports group.","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    We use heapq.merge() below to do the merge sort of things from the"},{"line_number":70,"context_line":"    cell databases. That routine assumes it can use regular python"},{"line_number":71,"context_line":"    operators (\u003e and \u003c) on the contents. Since that won\u0027t work with"},{"line_number":72,"context_line":"    instances from the database (and depends on the sort keys/dirs),"},{"line_number":73,"context_line":"    we need this wrapper class to provide that."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    Implementing __lt__ is enough for heapq.merge() to do its work."}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_2ef42ccf","line":72,"range":{"start_line":72,"start_character":4,"end_line":72,"end_character":13},"updated":"2017-11-30 18:54:30.000000000","message":"records?","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c224f698a0edc411f70afa1f8435747da4000d21","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    We use heapq.merge() below to do the merge sort of things from the"},{"line_number":70,"context_line":"    cell databases. That routine assumes it can use regular python"},{"line_number":71,"context_line":"    operators (\u003e and \u003c) on the contents. Since that won\u0027t work with"},{"line_number":72,"context_line":"    instances from the database (and depends on the sort keys/dirs),"},{"line_number":73,"context_line":"    we need this wrapper class to provide that."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    Implementing __lt__ is enough for heapq.merge() to do its work."}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_8e777809","line":72,"range":{"start_line":72,"start_character":4,"end_line":72,"end_character":13},"in_reply_to":"ff82abbf_2ef42ccf","updated":"2017-11-30 18:58:24.000000000","message":"So, everywhere in here that I left \"instance\" I meant \"instance of a DB object\" not \"Instance, the formal nova object\". If you think that\u0027s confusing, I can change it, but \"record\" does not have properties.","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9046c496224f319c2d726652bb79d82d6ab2fff0","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    We use heapq.merge() below to do the merge sort of things from the"},{"line_number":70,"context_line":"    cell databases. That routine assumes it can use regular python"},{"line_number":71,"context_line":"    operators (\u003e and \u003c) on the contents. Since that won\u0027t work with"},{"line_number":72,"context_line":"    instances from the database (and depends on the sort keys/dirs),"},{"line_number":73,"context_line":"    we need this wrapper class to provide that."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    Implementing __lt__ is enough for heapq.merge() to do its work."}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_6eed548a","line":72,"range":{"start_line":72,"start_character":4,"end_line":72,"end_character":13},"in_reply_to":"ff82abbf_8e777809","updated":"2017-11-30 19:01:27.000000000","message":"Fine to leave it, I can interpret it either way.","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        in each cell."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param ctx: A RequestContext"},{"line_number":140,"context_line":"        :param values: The values of the sort_keys properties of fhe actual"},{"line_number":141,"context_line":"                       marker instance"},{"line_number":142,"context_line":"        :returns: The identifier of the equivalent marker in the local database"},{"line_number":143,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_8eba18df","line":140,"range":{"start_line":140,"start_character":65,"end_line":140,"end_character":68},"updated":"2017-11-30 18:54:30.000000000","message":"wtfhe","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        RecordSortContext provided to the constructor for this object."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function is a generator of records from the database like what you"},{"line_number":175,"context_line":"        would get from instance_get_all_by_filters_sort() in the DB API."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        NOTE: Since we do these in parallel, a nonzero limit will be passed"},{"line_number":178,"context_line":"        to each database query, although the limit will be enforced in the"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_6e879411","line":175,"range":{"start_line":175,"start_character":23,"end_line":175,"end_character":55},"updated":"2017-11-30 18:54:30.000000000","message":"Looks like this just returns a list, not a generator.","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f403d6ab0523021b4a5ecd7f65f5c18d086b2fbf","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        RecordSortContext provided to the constructor for this object."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function is a generator of records from the database like what you"},{"line_number":175,"context_line":"        would get from instance_get_all_by_filters_sort() in the DB API."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        NOTE: Since we do these in parallel, a nonzero limit will be passed"},{"line_number":178,"context_line":"        to each database query, although the limit will be enforced in the"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_cefb4045","line":175,"range":{"start_line":175,"start_character":23,"end_line":175,"end_character":55},"in_reply_to":"ff82abbf_4ee8907b","updated":"2017-11-30 19:02:18.000000000","message":"Ack, will fix.","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9046c496224f319c2d726652bb79d82d6ab2fff0","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        RecordSortContext provided to the constructor for this object."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function is a generator of records from the database like what you"},{"line_number":175,"context_line":"        would get from instance_get_all_by_filters_sort() in the DB API."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        NOTE: Since we do these in parallel, a nonzero limit will be passed"},{"line_number":178,"context_line":"        to each database query, although the limit will be enforced in the"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_4ee8907b","line":175,"range":{"start_line":175,"start_character":23,"end_line":175,"end_character":55},"in_reply_to":"ff82abbf_6e86b4de","updated":"2017-11-30 19:01:27.000000000","message":"Yeah I realized it was copied, but reading with fresh eyes.","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c224f698a0edc411f70afa1f8435747da4000d21","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        RecordSortContext provided to the constructor for this object."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function is a generator of records from the database like what you"},{"line_number":175,"context_line":"        would get from instance_get_all_by_filters_sort() in the DB API."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        NOTE: Since we do these in parallel, a nonzero limit will be passed"},{"line_number":178,"context_line":"        to each database query, although the limit will be enforced in the"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_6e86b4de","line":175,"range":{"start_line":175,"start_character":23,"end_line":175,"end_character":55},"in_reply_to":"ff82abbf_6e879411","updated":"2017-11-30 18:58:24.000000000","message":"This is an existing comment, FWIW. I doesn\u0027t mean \"a generator like..\" it means \"it generates objects like ... that other method would return\". But, I can reword.","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            # the \u0027global\u0027 marker as it determines where we start the"},{"line_number":187,"context_line":"            # process across all cells. Look up the record in"},{"line_number":188,"context_line":"            # whatever cell it is in and record the values for the"},{"line_number":189,"context_line":"            # sort keys so we can find the marker instance in each"},{"line_number":190,"context_line":"            # cell (called the \u0027local\u0027 marker)."},{"line_number":191,"context_line":"            global_marker_record \u003d self.get_marker_record(ctx, marker)"},{"line_number":192,"context_line":"            global_marker_values \u003d [global_marker_record[key]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_2e798c2e","line":189,"range":{"start_line":189,"start_character":50,"end_line":189,"end_character":58},"updated":"2017-11-30 18:54:30.000000000","message":"record?","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                        # We did find a marker in our cell, but it wasn\u0027t"},{"line_number":229,"context_line":"                        # the global marker. Thus, we will use it as our"},{"line_number":230,"context_line":"                        # marker in the main query below, but we also need"},{"line_number":231,"context_line":"                        # to prefix that result with this marker instance"},{"line_number":232,"context_line":"                        # since the result below will not return it and it"},{"line_number":233,"context_line":"                        # has not been returned to the user yet. Note that"},{"line_number":234,"context_line":"                        # we do _not_ prefix the marker instance if our"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_6e9c745d","line":231,"range":{"start_line":231,"start_character":65,"end_line":231,"end_character":73},"updated":"2017-11-30 18:54:30.000000000","message":"record","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                        # to prefix that result with this marker instance"},{"line_number":232,"context_line":"                        # since the result below will not return it and it"},{"line_number":233,"context_line":"                        # has not been returned to the user yet. Note that"},{"line_number":234,"context_line":"                        # we do _not_ prefix the marker instance if our"},{"line_number":235,"context_line":"                        # marker was the global one since that has already"},{"line_number":236,"context_line":"                        # been sent to the user."},{"line_number":237,"context_line":"                        local_marker_filters \u003d copy.copy(filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_ceaa6070","line":234,"range":{"start_line":234,"start_character":56,"end_line":234,"end_character":64},"updated":"2017-11-30 18:54:30.000000000","message":"record","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":238,"context_line":"                        if marker_id not in local_marker_filters:"},{"line_number":239,"context_line":"                            # If an $id filter was provided, it will"},{"line_number":240,"context_line":"                            # have included our marker already if this"},{"line_number":241,"context_line":"                            # instance is desired in the output"},{"line_number":242,"context_line":"                            # set. If it wasn\u0027t, we specifically query"},{"line_number":243,"context_line":"                            # for it. If the other filters would have"},{"line_number":244,"context_line":"                            # excluded it, then we\u0027ll get an empty set"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_4eb090de","line":241,"range":{"start_line":241,"start_character":30,"end_line":241,"end_character":38},"updated":"2017-11-30 18:54:30.000000000","message":"record","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d0056ed7a45e0b125d2212e87e75dc790568bd2","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        limit \u003d limit or 0"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        # Generate results from heapq so we can return the inner"},{"line_number":280,"context_line":"        # instance instead of the wrapper. This is basically free"},{"line_number":281,"context_line":"        # as it works as our caller iterates the results."},{"line_number":282,"context_line":"        for i in heapq.merge(*results.values()):"},{"line_number":283,"context_line":"            yield i._db_record"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_ae091c96","line":280,"range":{"start_line":280,"start_character":10,"end_line":280,"end_character":18},"updated":"2017-11-30 18:54:30.000000000","message":"record","commit_id":"2f43fcaf5e9871bc7b6b93ec5a1a3174430e4973"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"a576dbd0c67ab5229fbf4313b9c3bd33b15ee990","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.sort_dirs \u003d sort_dirs"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def compare_records(self, rec1, rec2):"},{"line_number":32,"context_line":"        \"\"\"Implements cmp(inst1, inst2) for the first key that is different."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Adjusts for the requested sort direction by inverting the result"},{"line_number":35,"context_line":"        as needed."}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_cd033cbe","line":32,"range":{"start_line":32,"start_character":23,"end_line":32,"end_character":39},"updated":"2017-12-01 02:45:34.000000000","message":"nit, consider update if submitting new patchset","commit_id":"a4723f4435d7849661d84bdfc109537d97b93cc9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"e60aff4d42c9349575cbbd2cb52fb23d6fb71fe4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import copy"},{"line_number":15,"context_line":"import heapq"},{"line_number":16,"context_line":"import itertools"},{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova import context"},{"line_number":20,"context_line":"from nova import db"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_8165c447","line":17,"updated":"2017-12-05 17:43:27.000000000","message":"Third-party lib is supposed to have its own section.","commit_id":"cbf6283a0068770ec46d5c0fa93e6af3371778cf"}]}
