)]}'
{"cyborg/db/api.py":[{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @abc.abstractmethod"},{"line_number":108,"context_line":"    def attribute_get_by_deployable_id(self, context, deployable_uuid):"},{"line_number":109,"context_line":"        \"\"\"Get requested attribute by attribute uuid.\"\"\""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @abc.abstractmethod"},{"line_number":112,"context_line":"    def attribute_get_by_filter(self, context, filters):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_cfe0219a","line":109,"range":{"start_line":109,"start_character":38,"end_line":109,"end_character":53},"updated":"2018-05-03 11:35:08.000000000","message":"deployable id?","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @abc.abstractmethod"},{"line_number":108,"context_line":"    def attribute_get_by_deployable_id(self, context, deployable_uuid):"},{"line_number":109,"context_line":"        \"\"\"Get requested attribute by attribute uuid.\"\"\""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @abc.abstractmethod"},{"line_number":112,"context_line":"    def attribute_get_by_filter(self, context, filters):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_eaf48fd1","line":109,"range":{"start_line":109,"start_character":38,"end_line":109,"end_character":53},"in_reply_to":"5f7c97a3_cfe0219a","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @abc.abstractmethod"},{"line_number":112,"context_line":"    def attribute_get_by_filter(self, context, filters):"},{"line_number":113,"context_line":"        \"\"\"Get requested attribute by kv pair and deployable id.\"\"\""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @abc.abstractmethod"},{"line_number":116,"context_line":"    def attribute_update(self, context, uuid, key, value):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_8f99c920","line":113,"range":{"start_line":113,"start_character":50,"end_line":113,"end_character":63},"updated":"2018-05-03 11:35:08.000000000","message":"How to pass deployable id?\nby filters?","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @abc.abstractmethod"},{"line_number":112,"context_line":"    def attribute_get_by_filter(self, context, filters):"},{"line_number":113,"context_line":"        \"\"\"Get requested attribute by kv pair and deployable id.\"\"\""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @abc.abstractmethod"},{"line_number":116,"context_line":"    def attribute_update(self, context, uuid, key, value):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_8a039bb8","line":113,"range":{"start_line":113,"start_character":50,"end_line":113,"end_character":63},"in_reply_to":"5f7c97a3_8f99c920","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"}],"cyborg/db/sqlalchemy/api.py":[{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        return deployables"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def attribute_create(self, context, values):"},{"line_number":338,"context_line":"        if not values.get(\u0027uuid\u0027):"},{"line_number":339,"context_line":"            values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":340,"context_line":"        if values.get(\u0027id\u0027):"},{"line_number":341,"context_line":"            values.pop(\u0027id\u0027, None)"},{"line_number":342,"context_line":"        attribute \u003d models.Attribute()"},{"line_number":343,"context_line":"        attribute.update(values)"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_4a5b9f2d","line":341,"range":{"start_line":338,"start_character":8,"end_line":341,"end_character":34},"updated":"2018-05-03 11:35:08.000000000","message":"No error about your logic. You can ignore.\n\nAnother Programming habits, no need conditional judgment.\nvalues.setdefault(uuidutils.generate_uuid())\n\nvalues.pop(\u0027id\u0027, None)","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        return deployables"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def attribute_create(self, context, values):"},{"line_number":338,"context_line":"        if not values.get(\u0027uuid\u0027):"},{"line_number":339,"context_line":"            values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":340,"context_line":"        if values.get(\u0027id\u0027):"},{"line_number":341,"context_line":"            values.pop(\u0027id\u0027, None)"},{"line_number":342,"context_line":"        attribute \u003d models.Attribute()"},{"line_number":343,"context_line":"        attribute.update(values)"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_ea6faf8f","line":341,"range":{"start_line":338,"start_character":8,"end_line":341,"end_character":34},"in_reply_to":"5f7c97a3_4a5b9f2d","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"}],"cyborg/objects/attribute.py":[{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @classmethod"},{"line_number":61,"context_line":"    def get_by_deployable_id(cls, context, deployable_id):"},{"line_number":62,"context_line":"        \"\"\"Get a attribute by deployable_uuid\"\"\""},{"line_number":63,"context_line":"        db_attr \u003d cls.dbapi.attribute_get_by_deployable_id(context,"},{"line_number":64,"context_line":"                                                           deployable_id)"},{"line_number":65,"context_line":"        return cls._from_db_object_list(db_attr, context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_8ad77724","line":62,"range":{"start_line":62,"start_character":40,"end_line":62,"end_character":45},"updated":"2018-05-03 11:35:08.000000000","message":"id or uuid?","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @classmethod"},{"line_number":61,"context_line":"    def get_by_deployable_id(cls, context, deployable_id):"},{"line_number":62,"context_line":"        \"\"\"Get a attribute by deployable_uuid\"\"\""},{"line_number":63,"context_line":"        db_attr \u003d cls.dbapi.attribute_get_by_deployable_id(context,"},{"line_number":64,"context_line":"                                                           deployable_id)"},{"line_number":65,"context_line":"        return cls._from_db_object_list(db_attr, context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_2a13670f","line":62,"range":{"start_line":62,"start_character":40,"end_line":62,"end_character":45},"in_reply_to":"5f7c97a3_8ad77724","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"},{"line_number":68,"context_line":"    def get_by_filter(cls, context, filters):"},{"line_number":69,"context_line":"        \"\"\"Get a attribute by deployable_uuid\"\"\""},{"line_number":70,"context_line":"        db_attr \u003d cls.dbapi.attribute_get_by_filter(context, filters)"},{"line_number":71,"context_line":"        return cls._from_db_object_list(db_attr, context)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_2aaae384","line":69,"range":{"start_line":69,"start_character":15,"end_line":69,"end_character":26},"updated":"2018-05-03 11:35:08.000000000","message":"Nits.\nan.","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"},{"line_number":68,"context_line":"    def get_by_filter(cls, context, filters):"},{"line_number":69,"context_line":"        \"\"\"Get a attribute by deployable_uuid\"\"\""},{"line_number":70,"context_line":"        db_attr \u003d cls.dbapi.attribute_get_by_filter(context, filters)"},{"line_number":71,"context_line":"        return cls._from_db_object_list(db_attr, context)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_caf993c8","line":69,"range":{"start_line":69,"start_character":15,"end_line":69,"end_character":26},"in_reply_to":"5f7c97a3_2aaae384","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"}],"cyborg/objects/deployable.py":[{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        query \u003d {\"deployable_id\": db_deps.id}"},{"line_number":101,"context_line":"        attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":102,"context_line":"                                                query)"},{"line_number":103,"context_line":"        db_deps.virtual_function_list \u003d attr_get_list"},{"line_number":104,"context_line":"        return cls._from_db_object_list(db_deps, context)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_8abc57bc","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":37},"updated":"2018-05-03 11:35:08.000000000","message":"virtual_function_list is used for vfs.\n\nwhy assign attributes to this list?\nWhat\u0027s the relationship between attributes and vfs?","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        query \u003d {\"deployable_id\": db_deps.id}"},{"line_number":101,"context_line":"        attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":102,"context_line":"                                                query)"},{"line_number":103,"context_line":"        db_deps.virtual_function_list \u003d attr_get_list"},{"line_number":104,"context_line":"        return cls._from_db_object_list(db_deps, context)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_6a64ffb9","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":37},"in_reply_to":"5f7c97a3_8abc57bc","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            query \u003d {\"deployable_id\": obj_dpl.id}"},{"line_number":114,"context_line":"            attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":115,"context_line":"                                                    query)"},{"line_number":116,"context_line":"            obj_dpl.virtual_function_list \u003d attr_get_list"},{"line_number":117,"context_line":"        return obj_dpl_list"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def save(self, context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_2ae663ea","line":116,"range":{"start_line":116,"start_character":20,"end_line":116,"end_character":41},"updated":"2018-05-03 11:35:08.000000000","message":"Ditto","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            query \u003d {\"deployable_id\": obj_dpl.id}"},{"line_number":114,"context_line":"            attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":115,"context_line":"                                                    query)"},{"line_number":116,"context_line":"            obj_dpl.virtual_function_list \u003d attr_get_list"},{"line_number":117,"context_line":"        return obj_dpl_list"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def save(self, context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_0a5b0bf7","line":116,"range":{"start_line":116,"start_character":20,"end_line":116,"end_character":41},"in_reply_to":"5f7c97a3_2ae663ea","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        for exist_attr in self.attributes_list:"},{"line_number":138,"context_line":"            if base.obj_equal_prims(attribute, exist_attr):"},{"line_number":139,"context_line":"                LOG.warning(\"The vf already exists\")"},{"line_number":140,"context_line":"                return None"},{"line_number":141,"context_line":"        attribute.deployable_id \u003d self.id"},{"line_number":142,"context_line":"        attribute_copy \u003d copy.deepcopy(attribute)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_4a04ff7b","line":139,"range":{"start_line":139,"start_character":33,"end_line":139,"end_character":35},"updated":"2018-05-03 11:35:08.000000000","message":"attribute","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        for exist_attr in self.attributes_list:"},{"line_number":138,"context_line":"            if base.obj_equal_prims(attribute, exist_attr):"},{"line_number":139,"context_line":"                LOG.warning(\"The vf already exists\")"},{"line_number":140,"context_line":"                return None"},{"line_number":141,"context_line":"        attribute.deployable_id \u003d self.id"},{"line_number":142,"context_line":"        attribute_copy \u003d copy.deepcopy(attribute)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_4a38239f","line":139,"range":{"start_line":139,"start_character":33,"end_line":139,"end_character":35},"in_reply_to":"5f7c97a3_4a04ff7b","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.attributes_list.append(attribute_copy)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def delete_attribute(self, context, attribute):"},{"line_number":146,"context_line":"        \"\"\"remove a attribute from the attributes_list"},{"line_number":147,"context_line":"        if the attribute does not exist, ignore it"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_8a2f77f5","line":146,"range":{"start_line":146,"start_character":18,"end_line":146,"end_character":19},"updated":"2018-05-03 11:35:08.000000000","message":"an","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.attributes_list.append(attribute_copy)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def delete_attribute(self, context, attribute):"},{"line_number":146,"context_line":"        \"\"\"remove a attribute from the attributes_list"},{"line_number":147,"context_line":"        if the attribute does not exist, ignore it"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_aabbf70b","line":146,"range":{"start_line":146,"start_character":18,"end_line":146,"end_character":19},"in_reply_to":"5f7c97a3_8a2f77f5","updated":"2018-05-09 04:30:14.000000000","message":"Done","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        idx \u003d 0"},{"line_number":151,"context_line":"        for exist_attribute in self.attributes_list:"},{"line_number":152,"context_line":"            if base.obj_equal_prims(attribute, exist_attribute):"},{"line_number":153,"context_line":"                removed_attribute \u003d self.attributes_list.pop(idx)"},{"line_number":154,"context_line":"                removed_attribute.destroy(context)"},{"line_number":155,"context_line":"                return"},{"line_number":156,"context_line":"            idx \u003d idx + 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_aa4ef3be","line":153,"range":{"start_line":153,"start_character":57,"end_line":153,"end_character":65},"updated":"2018-05-03 11:35:08.000000000","message":"why not use remove(exist_attribute)?","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        idx \u003d 0"},{"line_number":151,"context_line":"        for exist_attribute in self.attributes_list:"},{"line_number":152,"context_line":"            if base.obj_equal_prims(attribute, exist_attribute):"},{"line_number":153,"context_line":"                removed_attribute \u003d self.attributes_list.pop(idx)"},{"line_number":154,"context_line":"                removed_attribute.destroy(context)"},{"line_number":155,"context_line":"                return"},{"line_number":156,"context_line":"            idx \u003d idx + 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_b27ae085","line":153,"range":{"start_line":153,"start_character":57,"end_line":153,"end_character":65},"in_reply_to":"5f7c97a3_aa4ef3be","updated":"2018-05-09 04:30:14.000000000","message":"https://stackoverflow.com/questions/11520492/difference-between-del-remove-and-pop-on-lists\n\n\"remove\" removes the first matching value, not a specific index.\n\nin addition, I believe pop/del is faster than remove since they save the computation for comparing.","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"0f2a74abfea929281d79b5a13cb6dda63c338ba7","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                                                          marker\u003dmarker,"},{"line_number":179,"context_line":"                                                          join_columns\u003djoin)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        if not attribute_filters:"},{"line_number":182,"context_line":"            # No Attribute filters are specified, take the normal path"},{"line_number":183,"context_line":"            for db_dpl in db_dpl_list:"},{"line_number":184,"context_line":"                obj_dpl \u003d cls._from_db_object(cls(context), db_dpl)"},{"line_number":185,"context_line":"                query \u003d {\"deployable_id\": obj_dpl.id}"},{"line_number":186,"context_line":"                attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":187,"context_line":"                                                        query)"},{"line_number":188,"context_line":"                obj_dpl.virtual_function_list \u003d attr_get_list"},{"line_number":189,"context_line":"                obj_dpl_list.append(obj_dpl)"},{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            # Also need to apply attribute filters"},{"line_number":192,"context_line":"            for key, value in attribute_filters.iteritems():"},{"line_number":193,"context_line":"                # get all the attributes match this kv"},{"line_number":194,"context_line":"                querry \u003d {\"key\": key, \"value\": value}"},{"line_number":195,"context_line":"                db_attr_list \u003d cls.dbapi.attribute_get_by_filter(context,"},{"line_number":196,"context_line":"                                                                 querry)"},{"line_number":197,"context_line":"                dpl_has_attrs \u003d False"},{"line_number":198,"context_line":"                # go throught the deployable list to kick out all that"},{"line_number":199,"context_line":"                # does not have this attribute"},{"line_number":200,"context_line":"                db_dpl_list_copy \u003d copy.deepcopy(db_dpl_list)"},{"line_number":201,"context_line":"                # Iterate from bebind to avoid out of order problem"},{"line_number":202,"context_line":"                # after removing"},{"line_number":203,"context_line":"                idx \u003d len(db_dpl_list_copy) - 1"},{"line_number":204,"context_line":"                for db_dpl in reversed(db_dpl_list_copy):"},{"line_number":205,"context_line":"                    dpl_has_attr \u003d False"},{"line_number":206,"context_line":"                    for db_attr in db_attr_list:"},{"line_number":207,"context_line":"                        if db_attr.deployable_id \u003d\u003d db_dpl.id:"},{"line_number":208,"context_line":"                            dpl_has_attr \u003d True"},{"line_number":209,"context_line":"                            break"},{"line_number":210,"context_line":"                    if not dpl_has_attr:"},{"line_number":211,"context_line":"                        # if the deployable does not have"},{"line_number":212,"context_line":"                        # any of the attributes, remove it from the list"},{"line_number":213,"context_line":"                        db_dpl_list.pop(idx)"},{"line_number":214,"context_line":"                    idx \u003d idx - 1"},{"line_number":215,"context_line":"            # After cleaning up the list, convert db objects to actual objects"},{"line_number":216,"context_line":"            for db_dpl in db_dpl_list:"},{"line_number":217,"context_line":"                obj_dpl \u003d cls._from_db_object(cls(context), db_dpl)"},{"line_number":218,"context_line":"                query \u003d {\"deployable_id\": obj_dpl.id}"},{"line_number":219,"context_line":"                # Restore the list of all the attributes"},{"line_number":220,"context_line":"                attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":221,"context_line":"                                                        query)"},{"line_number":222,"context_line":"                obj_dpl.virtual_function_list \u003d attr_get_list"},{"line_number":223,"context_line":"                obj_dpl_list.append(obj_dpl)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        return obj_dpl_list"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_34456971","line":223,"range":{"start_line":181,"start_character":6,"end_line":223,"end_character":44},"updated":"2018-05-03 11:35:08.000000000","message":"can this logic be done by the underlay db query?","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"},{"author":{"_account_id":27458,"name":"Li Liu","email":"liliueecg@gmail.com","username":"liliu"},"change_message_id":"f7853ef67978ba281aa1732935d6876f9d2da9df","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                                                          marker\u003dmarker,"},{"line_number":179,"context_line":"                                                          join_columns\u003djoin)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        if not attribute_filters:"},{"line_number":182,"context_line":"            # No Attribute filters are specified, take the normal path"},{"line_number":183,"context_line":"            for db_dpl in db_dpl_list:"},{"line_number":184,"context_line":"                obj_dpl \u003d cls._from_db_object(cls(context), db_dpl)"},{"line_number":185,"context_line":"                query \u003d {\"deployable_id\": obj_dpl.id}"},{"line_number":186,"context_line":"                attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":187,"context_line":"                                                        query)"},{"line_number":188,"context_line":"                obj_dpl.virtual_function_list \u003d attr_get_list"},{"line_number":189,"context_line":"                obj_dpl_list.append(obj_dpl)"},{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            # Also need to apply attribute filters"},{"line_number":192,"context_line":"            for key, value in attribute_filters.iteritems():"},{"line_number":193,"context_line":"                # get all the attributes match this kv"},{"line_number":194,"context_line":"                querry \u003d {\"key\": key, \"value\": value}"},{"line_number":195,"context_line":"                db_attr_list \u003d cls.dbapi.attribute_get_by_filter(context,"},{"line_number":196,"context_line":"                                                                 querry)"},{"line_number":197,"context_line":"                dpl_has_attrs \u003d False"},{"line_number":198,"context_line":"                # go throught the deployable list to kick out all that"},{"line_number":199,"context_line":"                # does not have this attribute"},{"line_number":200,"context_line":"                db_dpl_list_copy \u003d copy.deepcopy(db_dpl_list)"},{"line_number":201,"context_line":"                # Iterate from bebind to avoid out of order problem"},{"line_number":202,"context_line":"                # after removing"},{"line_number":203,"context_line":"                idx \u003d len(db_dpl_list_copy) - 1"},{"line_number":204,"context_line":"                for db_dpl in reversed(db_dpl_list_copy):"},{"line_number":205,"context_line":"                    dpl_has_attr \u003d False"},{"line_number":206,"context_line":"                    for db_attr in db_attr_list:"},{"line_number":207,"context_line":"                        if db_attr.deployable_id \u003d\u003d db_dpl.id:"},{"line_number":208,"context_line":"                            dpl_has_attr \u003d True"},{"line_number":209,"context_line":"                            break"},{"line_number":210,"context_line":"                    if not dpl_has_attr:"},{"line_number":211,"context_line":"                        # if the deployable does not have"},{"line_number":212,"context_line":"                        # any of the attributes, remove it from the list"},{"line_number":213,"context_line":"                        db_dpl_list.pop(idx)"},{"line_number":214,"context_line":"                    idx \u003d idx - 1"},{"line_number":215,"context_line":"            # After cleaning up the list, convert db objects to actual objects"},{"line_number":216,"context_line":"            for db_dpl in db_dpl_list:"},{"line_number":217,"context_line":"                obj_dpl \u003d cls._from_db_object(cls(context), db_dpl)"},{"line_number":218,"context_line":"                query \u003d {\"deployable_id\": obj_dpl.id}"},{"line_number":219,"context_line":"                # Restore the list of all the attributes"},{"line_number":220,"context_line":"                attr_get_list \u003d Attribute.get_by_filter(context,"},{"line_number":221,"context_line":"                                                        query)"},{"line_number":222,"context_line":"                obj_dpl.virtual_function_list \u003d attr_get_list"},{"line_number":223,"context_line":"                obj_dpl_list.append(obj_dpl)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        return obj_dpl_list"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_2ad04750","line":223,"range":{"start_line":181,"start_character":6,"end_line":223,"end_character":44},"in_reply_to":"5f7c97a3_34456971","updated":"2018-05-09 04:30:14.000000000","message":"Sure, addressed","commit_id":"80b7bd623c65c4d63f0e2d33daa7113367f3d164"}]}
