)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c4663d4992ca4fecbe22655b9f2f9afa31f5aa51","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alexander Makarov \u003camakarov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-31 12:26:34 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Materialized path mixin"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Sqlalchemy mixin to be used in hierarchical models."},{"line_number":10,"context_line":"Tree manipulations are performed by simply assigning parent of the node,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1a4dcd0f_f7d37b02","line":7,"updated":"2015-08-05 15:58:55.000000000","message":"materialize path mixin for what?","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"9f629ab12861ac5e4909189b5e88b293e3b64545","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alexander Makarov \u003camakarov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-31 12:26:34 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Materialized path mixin"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Sqlalchemy mixin to be used in hierarchical models."},{"line_number":10,"context_line":"Tree manipulations are performed by simply assigning parent of the node,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1a4dcd0f_d2ef60e7","line":7,"in_reply_to":"1a4dcd0f_f7d37b02","updated":"2015-08-05 20:34:43.000000000","message":"Done","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"}],"keystone/common/sql/core.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"3c782065f03c5099d62e6e26ed8da4163b8472ea","unresolved":false,"context_lines":[{"line_number":466,"context_line":"    return decorator"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"class MPMixin(object):"},{"line_number":470,"context_line":"    \"\"\"Materialized path mixin for SQL models.\"\"\""},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    DELIMITER \u003d \u0027.\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_802116b7","line":469,"updated":"2015-07-03 16:29:28.000000000","message":"One looking at this name won\u0027t understand it easily, I wouldn\u0027t be afraid to put the whole name and call it MaterializedPathMixin, improving clarity.","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"06b2384a53a7bd4c3267b0f4199da02bd727fc36","unresolved":false,"context_lines":[{"line_number":466,"context_line":"    return decorator"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"class MPMixin(object):"},{"line_number":470,"context_line":"    \"\"\"Materialized path mixin for SQL models.\"\"\""},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    DELIMITER \u003d \u0027.\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_e624bab3","line":469,"in_reply_to":"ba3cc151_802116b7","updated":"2015-07-03 17:17:16.000000000","message":"I\u0027ve thought about it: mixin is used in conjunction with another base, so it\u0027s a good idea to have it short.","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"3c782065f03c5099d62e6e26ed8da4163b8472ea","unresolved":false,"context_lines":[{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def query_descendants(self, session):"},{"line_number":477,"context_line":"        class_ \u003d self.__class__"},{"line_number":478,"context_line":"        pattern \u003d \"%s%s%%\" % (self.path, self.DELIMITER)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        query \u003d session.query(class_)"},{"line_number":481,"context_line":"        query \u003d query.filter(class_.path.like(pattern)).order_by(class_.path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_00674626","line":478,"updated":"2015-07-03 16:29:28.000000000","message":"What is the last % for ?","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"73997d7d1ea1f7bb80568da42cad62add909867b","unresolved":false,"context_lines":[{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def query_descendants(self, session):"},{"line_number":477,"context_line":"        class_ \u003d self.__class__"},{"line_number":478,"context_line":"        pattern \u003d \"%s%s%%\" % (self.path, self.DELIMITER)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        query \u003d session.query(class_)"},{"line_number":481,"context_line":"        query \u003d query.filter(class_.path.like(pattern)).order_by(class_.path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_0303d00e","line":478,"in_reply_to":"ba3cc151_00674626","updated":"2015-07-03 16:30:43.000000000","message":"Actually there are two % ...","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"06b2384a53a7bd4c3267b0f4199da02bd727fc36","unresolved":false,"context_lines":[{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def query_descendants(self, session):"},{"line_number":477,"context_line":"        class_ \u003d self.__class__"},{"line_number":478,"context_line":"        pattern \u003d \"%s%s%%\" % (self.path, self.DELIMITER)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        query \u003d session.query(class_)"},{"line_number":481,"context_line":"        query \u003d query.filter(class_.path.like(pattern)).order_by(class_.path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_463006e9","line":478,"in_reply_to":"ba3cc151_0303d00e","updated":"2015-07-03 17:17:16.000000000","message":"It will produce pattern \u0027uuid.%\u0027 to be used in sql \u0027like\u0027 filter. Just double-checked it :)","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"3c782065f03c5099d62e6e26ed8da4163b8472ea","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        id_set \u003d self.path.split(self.DELIMITER)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        query \u003d session.query(class_)"},{"line_number":489,"context_line":"        query \u003d query.filter(class_.id.in_(id_set)).order_by(class_.path)"},{"line_number":490,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_004e6696","line":489,"updated":"2015-07-03 16:29:28.000000000","message":"This way it will find itself, won\u0027t it ?\nI\u0027d suggest creating a pattern as for query_descendants, it would be like :\n\n    pattern \u003d \"%s%s%\" % (self.DELIMITER, self.path)\n\nMakes sense ?","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"73997d7d1ea1f7bb80568da42cad62add909867b","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        id_set \u003d self.path.split(self.DELIMITER)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        query \u003d session.query(class_)"},{"line_number":489,"context_line":"        query \u003d query.filter(class_.id.in_(id_set)).order_by(class_.path)"},{"line_number":490,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_830fe02d","line":489,"in_reply_to":"ba3cc151_004e6696","updated":"2015-07-03 16:30:43.000000000","message":"To be consistent with my previous comment ...\n\n    pattern \u003d \"%s%s\" % (self.DELIMITER, self.path)","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"06b2384a53a7bd4c3267b0f4199da02bd727fc36","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        id_set \u003d self.path.split(self.DELIMITER)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        query \u003d session.query(class_)"},{"line_number":489,"context_line":"        query \u003d query.filter(class_.id.in_(id_set)).order_by(class_.path)"},{"line_number":490,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_e6991ad2","line":489,"in_reply_to":"ba3cc151_830fe02d","updated":"2015-07-03 17:17:16.000000000","message":"Yes, if the path includes self, then it will be returned among the others.","commit_id":"546b46c6e374455cfc421ad7c28d68d58992ff15"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c4663d4992ca4fecbe22655b9f2f9afa31f5aa51","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        return cls.__name__.lower()"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    @declarative.declared_attr"},{"line_number":493,"context_line":"    def path(self):"},{"line_number":494,"context_line":"        return sql.Column(\u0027path\u0027, sql.Text, default\u003d\u0027\u0027, index\u003dTrue)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_b74c13c9","line":493,"updated":"2015-08-05 15:58:55.000000000","message":"same comment here.","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"9f629ab12861ac5e4909189b5e88b293e3b64545","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        return cls.__name__.lower()"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    @declarative.declared_attr"},{"line_number":493,"context_line":"    def path(self):"},{"line_number":494,"context_line":"        return sql.Column(\u0027path\u0027, sql.Text, default\u003d\u0027\u0027, index\u003dTrue)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_b2dad44a","line":493,"in_reply_to":"1a4dcd0f_b74c13c9","updated":"2015-08-05 20:34:43.000000000","message":"Done","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c4663d4992ca4fecbe22655b9f2f9afa31f5aa51","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        return type(self).path.like(pattern)"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"    @property"},{"line_number":507,"context_line":"    def ancestors_filter(self):"},{"line_number":508,"context_line":"        id_column \u003d getattr(type(self), self.ID_COLUMN)"},{"line_number":509,"context_line":"        id_set \u003d self.path.split(self.DELIMITER)"},{"line_number":510,"context_line":"        return id_column.in_(id_set)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_3758038a","line":507,"updated":"2015-08-05 15:58:55.000000000","message":"same comment here.","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"9f629ab12861ac5e4909189b5e88b293e3b64545","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        return type(self).path.like(pattern)"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"    @property"},{"line_number":507,"context_line":"    def ancestors_filter(self):"},{"line_number":508,"context_line":"        id_column \u003d getattr(type(self), self.ID_COLUMN)"},{"line_number":509,"context_line":"        id_set \u003d self.path.split(self.DELIMITER)"},{"line_number":510,"context_line":"        return id_column.in_(id_set)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_52db504f","line":507,"in_reply_to":"1a4dcd0f_3758038a","updated":"2015-08-05 20:34:43.000000000","message":"Done","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c4663d4992ca4fecbe22655b9f2f9afa31f5aa51","unresolved":false,"context_lines":[{"line_number":519,"context_line":"            session.delete(self)"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    @hybrid.hybrid_property"},{"line_number":522,"context_line":"    def parent(self):"},{"line_number":523,"context_line":"        parent_id \u003d getattr(self, self.PARENT_COLUMN, None)"},{"line_number":524,"context_line":"        # NOTE(amakarov): this check is needed as mixin itself has no parent"},{"line_number":525,"context_line":"        # column field while autodoc tries to load it on discover"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_9767974c","line":522,"updated":"2015-08-05 15:58:55.000000000","message":"add doc strings to be consistent with other public methods in this class.","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"9f629ab12861ac5e4909189b5e88b293e3b64545","unresolved":false,"context_lines":[{"line_number":519,"context_line":"            session.delete(self)"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    @hybrid.hybrid_property"},{"line_number":522,"context_line":"    def parent(self):"},{"line_number":523,"context_line":"        parent_id \u003d getattr(self, self.PARENT_COLUMN, None)"},{"line_number":524,"context_line":"        # NOTE(amakarov): this check is needed as mixin itself has no parent"},{"line_number":525,"context_line":"        # column field while autodoc tries to load it on discover"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_12eaa8db","line":522,"in_reply_to":"1a4dcd0f_9767974c","updated":"2015-08-05 20:34:43.000000000","message":"Done","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c4663d4992ca4fecbe22655b9f2f9afa31f5aa51","unresolved":false,"context_lines":[{"line_number":574,"context_line":"                                 subtree_old_path, subtree_new_path)"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"        # Perform the update"},{"line_number":577,"context_line":"        stmt \u003d sql.update(type(self).__table__,"},{"line_number":578,"context_line":"                          self.descendants_filter,"},{"line_number":579,"context_line":"                          {path_column: path_func})"},{"line_number":580,"context_line":"        get_session().execute(stmt)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_f7b29b93","line":577,"updated":"2015-08-05 15:58:55.000000000","message":"does this stand for statement?","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"9f629ab12861ac5e4909189b5e88b293e3b64545","unresolved":false,"context_lines":[{"line_number":574,"context_line":"                                 subtree_old_path, subtree_new_path)"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"        # Perform the update"},{"line_number":577,"context_line":"        stmt \u003d sql.update(type(self).__table__,"},{"line_number":578,"context_line":"                          self.descendants_filter,"},{"line_number":579,"context_line":"                          {path_column: path_func})"},{"line_number":580,"context_line":"        get_session().execute(stmt)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_32e7a412","line":577,"in_reply_to":"1a4dcd0f_f7b29b93","updated":"2015-08-05 20:34:43.000000000","message":"Done","commit_id":"87b76c911e27e5cb69d00d5176d7f8143a3e721e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6d69407c15718f0e4a9573f16e6f51cf3e955cd","unresolved":false,"context_lines":[{"line_number":481,"context_line":"    # These may be overloaded in subclasses to reflect actual column names"},{"line_number":482,"context_line":"    # and options"},{"line_number":483,"context_line":"    ID_COLUMN \u003d \u0027id\u0027"},{"line_number":484,"context_line":"    PARENT_COLUMN \u003d \u0027parent_id\u0027"},{"line_number":485,"context_line":"    DELIMITER \u003d \u0027/\u0027"},{"line_number":486,"context_line":"    WILDCARD \u003d \u0027%\u0027"},{"line_number":487,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_d21f32b5","line":484,"updated":"2015-08-06 16:40:12.000000000","message":"why do we need parent_id? Can\u0027t we derive it from the path? i.e.\n\nparent_id \u003d self.path.split(self.DELIMITER)[-1]","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"947baca11dbe3485afd1516c147e665e5c5fd1ac","unresolved":false,"context_lines":[{"line_number":481,"context_line":"    # These may be overloaded in subclasses to reflect actual column names"},{"line_number":482,"context_line":"    # and options"},{"line_number":483,"context_line":"    ID_COLUMN \u003d \u0027id\u0027"},{"line_number":484,"context_line":"    PARENT_COLUMN \u003d \u0027parent_id\u0027"},{"line_number":485,"context_line":"    DELIMITER \u003d \u0027/\u0027"},{"line_number":486,"context_line":"    WILDCARD \u003d \u0027%\u0027"},{"line_number":487,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_f82ecd8a","line":484,"in_reply_to":"1a4dcd0f_d21f32b5","updated":"2015-08-06 17:14:46.000000000","message":"I don\u0027t like having parent_id in the \u0027host\u0027 model but the very idea of this mixin is to extend existing hierarchy, which already has \u0027parent\u0027 reference field. But the idea to use the path tail is cool: it saves a wierd check below!","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6d69407c15718f0e4a9573f16e6f51cf3e955cd","unresolved":false,"context_lines":[{"line_number":483,"context_line":"    ID_COLUMN \u003d \u0027id\u0027"},{"line_number":484,"context_line":"    PARENT_COLUMN \u003d \u0027parent_id\u0027"},{"line_number":485,"context_line":"    DELIMITER \u003d \u0027/\u0027"},{"line_number":486,"context_line":"    WILDCARD \u003d \u0027%\u0027"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    @declarative.declared_attr"},{"line_number":489,"context_line":"    def __tablename__(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_3253f66c","line":486,"updated":"2015-08-06 16:40:12.000000000","message":"If all these can be overloaded, don\u0027t we want to use the\n\ngetattr(type(self), ...)\n\nconsistently throughout?","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"947baca11dbe3485afd1516c147e665e5c5fd1ac","unresolved":false,"context_lines":[{"line_number":483,"context_line":"    ID_COLUMN \u003d \u0027id\u0027"},{"line_number":484,"context_line":"    PARENT_COLUMN \u003d \u0027parent_id\u0027"},{"line_number":485,"context_line":"    DELIMITER \u003d \u0027/\u0027"},{"line_number":486,"context_line":"    WILDCARD \u003d \u0027%\u0027"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    @declarative.declared_attr"},{"line_number":489,"context_line":"    def __tablename__(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_f8148de9","line":486,"in_reply_to":"1a4dcd0f_3253f66c","updated":"2015-08-06 17:14:46.000000000","message":"The idea is to use overloaded parameters if any, and \u0027self\u0027 contains exactly them as it\u0027s an instance of the derived class.","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6d69407c15718f0e4a9573f16e6f51cf3e955cd","unresolved":false,"context_lines":[{"line_number":507,"context_line":"    @property"},{"line_number":508,"context_line":"    def ancestors_filter(self):"},{"line_number":509,"context_line":"        \"\"\"Filter to find all ancestors of the node\"\"\""},{"line_number":510,"context_line":"        id_column \u003d getattr(type(self), self.ID_COLUMN)"},{"line_number":511,"context_line":"        id_set \u003d self.path.split(self.DELIMITER)"},{"line_number":512,"context_line":"        return id_column.in_(id_set)"},{"line_number":513,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_922f6a3e","line":510,"updated":"2015-08-06 16:40:12.000000000","message":"Dumb question: what\u0027s this \"getattr(type(self) ...\" trick does? Is it because this is intended to be a mixin and you need the real ID_COLUMN from its subclass? Just curious.","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"947baca11dbe3485afd1516c147e665e5c5fd1ac","unresolved":false,"context_lines":[{"line_number":507,"context_line":"    @property"},{"line_number":508,"context_line":"    def ancestors_filter(self):"},{"line_number":509,"context_line":"        \"\"\"Filter to find all ancestors of the node\"\"\""},{"line_number":510,"context_line":"        id_column \u003d getattr(type(self), self.ID_COLUMN)"},{"line_number":511,"context_line":"        id_set \u003d self.path.split(self.DELIMITER)"},{"line_number":512,"context_line":"        return id_column.in_(id_set)"},{"line_number":513,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_18ce1963","line":510,"in_reply_to":"1a4dcd0f_922f6a3e","updated":"2015-08-06 17:14:46.000000000","message":"Exactly.\n\nSince I don\u0027t know how \u0027id\u0027 is named, I have to use getattr\n\nSince I need not the value of the instance field, but the column of it\u0027s class, I request the type of the instance.","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6d69407c15718f0e4a9573f16e6f51cf3e955cd","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        \"\"\"The node instance refenced by node\u0027s parent column\"\"\""},{"line_number":526,"context_line":"        parent_id \u003d getattr(self, self.PARENT_COLUMN, None)"},{"line_number":527,"context_line":"        # NOTE(amakarov): this check is needed as mixin itself has no parent"},{"line_number":528,"context_line":"        # column field while autodoc tries to load it on discover"},{"line_number":529,"context_line":"        if parent_id is None:"},{"line_number":530,"context_line":"            return None"},{"line_number":531,"context_line":"        filter_by \u003d {self.ID_COLUMN: parent_id}"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_12711a0f","line":528,"updated":"2015-08-06 16:40:12.000000000","message":"Can we derive the parent_id from the path? See my first question.","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"947baca11dbe3485afd1516c147e665e5c5fd1ac","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        \"\"\"The node instance refenced by node\u0027s parent column\"\"\""},{"line_number":526,"context_line":"        parent_id \u003d getattr(self, self.PARENT_COLUMN, None)"},{"line_number":527,"context_line":"        # NOTE(amakarov): this check is needed as mixin itself has no parent"},{"line_number":528,"context_line":"        # column field while autodoc tries to load it on discover"},{"line_number":529,"context_line":"        if parent_id is None:"},{"line_number":530,"context_line":"            return None"},{"line_number":531,"context_line":"        filter_by \u003d {self.ID_COLUMN: parent_id}"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_d81f51b5","line":528,"in_reply_to":"1a4dcd0f_12711a0f","updated":"2015-08-06 17:14:46.000000000","message":"Thanks! That\u0027s a great idea!","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6d69407c15718f0e4a9573f16e6f51cf3e955cd","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _update_path(self, new_path):"},{"line_number":561,"context_line":"        # Update descendants"},{"line_number":562,"context_line":"        path_column \u003d type(self).path"},{"line_number":563,"context_line":"        id_value \u003d getattr(self, self.ID_COLUMN)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        # Path replacement preparation"},{"line_number":566,"context_line":"        if self.path:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_b2c2a6e7","line":563,"updated":"2015-08-06 16:40:12.000000000","message":"type(self)?","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"947baca11dbe3485afd1516c147e665e5c5fd1ac","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _update_path(self, new_path):"},{"line_number":561,"context_line":"        # Update descendants"},{"line_number":562,"context_line":"        path_column \u003d type(self).path"},{"line_number":563,"context_line":"        id_value \u003d getattr(self, self.ID_COLUMN)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        # Path replacement preparation"},{"line_number":566,"context_line":"        if self.path:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_d8fbd145","line":563,"in_reply_to":"1a4dcd0f_b2c2a6e7","updated":"2015-08-06 17:14:46.000000000","message":"No, I need a value here. It\u0027s seen in a variable name :)","commit_id":"5364e976531b2342af5cb385fa46c4975a230517"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b7b8c93717b7bf937366fb247478b0131054a920","unresolved":false,"context_lines":[{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    Adds \u0027path\u0027 text field to the host model."},{"line_number":477,"context_line":"    Requires string \u0027id\u0027 field (adjustable) in the host model."},{"line_number":478,"context_line":"    Requires string \u0027parent_id\u0027 field (adjustable) in the host model."},{"line_number":479,"context_line":"    \"\"\""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"    # These may be overloaded in subclasses to reflect actual column names"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_1e97f8ec","line":478,"updated":"2015-08-20 14:15:31.000000000","message":"would we be able to convert these to docstrings; like the following format? \n\nhttps://github.com/openstack/keystone/blob/master/keystone/notifications.py#L104-L113","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b7b8c93717b7bf937366fb247478b0131054a920","unresolved":false,"context_lines":[{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    @hybrid.hybrid_property"},{"line_number":524,"context_line":"    def parent(self):"},{"line_number":525,"context_line":"        \"\"\"The node instance refenced by node\u0027s parent column\"\"\""},{"line_number":526,"context_line":"        parent_id \u003d getattr(self, self.PARENT_COLUMN, None)"},{"line_number":527,"context_line":"        filter_by \u003d {self.ID_COLUMN: parent_id}"},{"line_number":528,"context_line":"        query \u003d get_session().query(type(self))"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_3e6afcee","line":525,"updated":"2015-08-20 14:15:31.000000000","message":"referenced*","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"f3556a9d8f5d3e29c710ae3b244ea151e7681fe3","unresolved":false,"context_lines":[{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    @hybrid.hybrid_property"},{"line_number":524,"context_line":"    def parent(self):"},{"line_number":525,"context_line":"        \"\"\"The node instance refenced by node\u0027s parent column\"\"\""},{"line_number":526,"context_line":"        parent_id \u003d getattr(self, self.PARENT_COLUMN, None)"},{"line_number":527,"context_line":"        filter_by \u003d {self.ID_COLUMN: parent_id}"},{"line_number":528,"context_line":"        query \u003d get_session().query(type(self))"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_e29e9e06","line":525,"in_reply_to":"fa1b9901_3e6afcee","updated":"2015-08-24 13:53:44.000000000","message":"Done","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ed933c60fd14ba0e50d1f504cbc3be19f263de91","unresolved":false,"context_lines":[{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    :param path: added field, contains generated materialized path"},{"line_number":475,"context_line":"    :type path: string"},{"line_number":476,"context_line":"    :param id: identifier field, required to be present in the host model"},{"line_number":477,"context_line":"    :type id: string"},{"line_number":478,"context_line":"    :param parent_id: identifier of the parent field,"},{"line_number":479,"context_line":"                      required to be present in the host model"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_1e55edc0","line":476,"updated":"2015-08-25 14:47:35.000000000","message":"what is the \u0027host model\u0027?","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e86b92a6db8aa9177bfb1f807eaf037cda237e27","unresolved":false,"context_lines":[{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    :param path: added field, contains generated materialized path"},{"line_number":475,"context_line":"    :type path: string"},{"line_number":476,"context_line":"    :param id: identifier field, required to be present in the host model"},{"line_number":477,"context_line":"    :type id: string"},{"line_number":478,"context_line":"    :param parent_id: identifier of the parent field,"},{"line_number":479,"context_line":"                      required to be present in the host model"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_ae149d43","line":476,"in_reply_to":"fa1b9901_1e55edc0","updated":"2015-08-26 11:42:49.000000000","message":"thanks, renamed to \u0027model being extended\u0027","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ed933c60fd14ba0e50d1f504cbc3be19f263de91","unresolved":false,"context_lines":[{"line_number":476,"context_line":"    :param id: identifier field, required to be present in the host model"},{"line_number":477,"context_line":"    :type id: string"},{"line_number":478,"context_line":"    :param parent_id: identifier of the parent field,"},{"line_number":479,"context_line":"                      required to be present in the host model"},{"line_number":480,"context_line":"    :type parent_id: string"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    Implements tree structure based purely on materialized path concept."}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_5e5fe5e4","line":479,"updated":"2015-08-25 14:47:35.000000000","message":"what is the \u0027host model\u0027?","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e86b92a6db8aa9177bfb1f807eaf037cda237e27","unresolved":false,"context_lines":[{"line_number":476,"context_line":"    :param id: identifier field, required to be present in the host model"},{"line_number":477,"context_line":"    :type id: string"},{"line_number":478,"context_line":"    :param parent_id: identifier of the parent field,"},{"line_number":479,"context_line":"                      required to be present in the host model"},{"line_number":480,"context_line":"    :type parent_id: string"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    Implements tree structure based purely on materialized path concept."}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_ce11d153","line":479,"in_reply_to":"fa1b9901_5e5fe5e4","updated":"2015-08-26 11:42:49.000000000","message":"Done","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"}],"keystone/tests/unit/common/test_sql_core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2b3eaaedc3c430ded6f55ae0daf62fbd584fede5","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class ExampleMPModel(ModelBase, sql.MaterializedPathMixin):"},{"line_number":58,"context_line":"    \"\"\"Test docstring\"\"\""},{"line_number":59,"context_line":"    __tablename__ \u003d \u0027testmpmodel\u0027"},{"line_number":60,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027parent_id\u0027, \u0027text\u0027]"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_3e06981c","line":58,"updated":"2015-08-11 17:02:08.000000000","message":"how about some docstring explaining what you are testing?","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b7b8c93717b7bf937366fb247478b0131054a920","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class ExampleMPModel(ModelBase, sql.MaterializedPathMixin):"},{"line_number":58,"context_line":"    \"\"\"Test docstring\"\"\""},{"line_number":59,"context_line":"    __tablename__ \u003d \u0027testmpmodel\u0027"},{"line_number":60,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027parent_id\u0027, \u0027text\u0027]"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_de574058","line":58,"in_reply_to":"1a4dcd0f_3912a80a","updated":"2015-08-20 14:15:31.000000000","message":"++","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"c216982882d6301f84d2853804a2c2122b4de26a","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class ExampleMPModel(ModelBase, sql.MaterializedPathMixin):"},{"line_number":58,"context_line":"    \"\"\"Test docstring\"\"\""},{"line_number":59,"context_line":"    __tablename__ \u003d \u0027testmpmodel\u0027"},{"line_number":60,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027parent_id\u0027, \u0027text\u0027]"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_3912a80a","line":58,"in_reply_to":"1a4dcd0f_3e06981c","updated":"2015-08-14 02:43:23.000000000","message":"++","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"f3556a9d8f5d3e29c710ae3b244ea151e7681fe3","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class ExampleMPModel(ModelBase, sql.MaterializedPathMixin):"},{"line_number":58,"context_line":"    \"\"\"Test docstring\"\"\""},{"line_number":59,"context_line":"    __tablename__ \u003d \u0027testmpmodel\u0027"},{"line_number":60,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027parent_id\u0027, \u0027text\u0027]"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_c5c9247b","line":58,"in_reply_to":"fa1b9901_de574058","updated":"2015-08-24 13:53:44.000000000","message":"Done","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2b3eaaedc3c430ded6f55ae0daf62fbd584fede5","unresolved":false,"context_lines":[{"line_number":57,"context_line":"class ExampleMPModel(ModelBase, sql.MaterializedPathMixin):"},{"line_number":58,"context_line":"    \"\"\"Test docstring\"\"\""},{"line_number":59,"context_line":"    __tablename__ \u003d \u0027testmpmodel\u0027"},{"line_number":60,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027parent_id\u0027, \u0027text\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":63,"context_line":"    parent_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_1e407c33","line":60,"updated":"2015-08-11 17:02:08.000000000","message":"we may need a test for ID and PARENT_ID column override since the code also support it","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"f3556a9d8f5d3e29c710ae3b244ea151e7681fe3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"class ExampleMPModel(ModelBase, sql.MaterializedPathMixin):"},{"line_number":58,"context_line":"    \"\"\"Test docstring\"\"\""},{"line_number":59,"context_line":"    __tablename__ \u003d \u0027testmpmodel\u0027"},{"line_number":60,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027parent_id\u0027, \u0027text\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":63,"context_line":"    parent_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_45caf41b","line":60,"in_reply_to":"1a4dcd0f_1e407c33","updated":"2015-08-24 13:53:44.000000000","message":"Done","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2b3eaaedc3c430ded6f55ae0daf62fbd584fede5","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        session \u003d sql.get_session()"},{"line_number":81,"context_line":"        query \u003d session.query(ExampleMPModel)"},{"line_number":82,"context_line":"        descendants \u003d query.filter(self.tree.descendants_filter)"},{"line_number":83,"context_line":"        # Attach the branch to the tree leaf"},{"line_number":84,"context_line":"        with session.begin():"},{"line_number":85,"context_line":"            self.attached.parent \u003d descendants.first()"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_fec5908d","line":83,"updated":"2015-08-11 17:02:08.000000000","message":"there are two leaf nodes, and you are attaching the subtree to one of them right? May want to make it clear in the comments.","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"f3556a9d8f5d3e29c710ae3b244ea151e7681fe3","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        session \u003d sql.get_session()"},{"line_number":81,"context_line":"        query \u003d session.query(ExampleMPModel)"},{"line_number":82,"context_line":"        descendants \u003d query.filter(self.tree.descendants_filter)"},{"line_number":83,"context_line":"        # Attach the branch to the tree leaf"},{"line_number":84,"context_line":"        with session.begin():"},{"line_number":85,"context_line":"            self.attached.parent \u003d descendants.first()"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_e543086b","line":83,"in_reply_to":"1a4dcd0f_fec5908d","updated":"2015-08-24 13:53:44.000000000","message":"Done","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2b3eaaedc3c430ded6f55ae0daf62fbd584fede5","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        self.attached.delete_tree()"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.assertEqual(0, descendants.count())"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def test_detach_branch(self):"},{"line_number":141,"context_line":"        \"\"\"Branch is separated\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_1e25dc07","line":138,"updated":"2015-08-11 17:02:08.000000000","message":"do we need to double check?\n\nquery.filter(self.attached.descendants_filter)","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"f3556a9d8f5d3e29c710ae3b244ea151e7681fe3","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        self.attached.delete_tree()"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.assertEqual(0, descendants.count())"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def test_detach_branch(self):"},{"line_number":141,"context_line":"        \"\"\"Branch is separated\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_5166362a","line":138,"in_reply_to":"1a4dcd0f_1e25dc07","updated":"2015-08-24 13:53:44.000000000","message":"I think it will be too much: descendants is a query made to check that tree is deleted. Why do we have to make exact one query twice?","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2b3eaaedc3c430ded6f55ae0daf62fbd584fede5","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        session \u003d sql.get_session()"},{"line_number":144,"context_line":"        query \u003d session.query(ExampleMPModel)"},{"line_number":145,"context_line":"        self.assertEqual("},{"line_number":146,"context_line":"            2, query.filter(self.attached.descendants_filter).count())"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_9ecd6c33","line":146,"updated":"2015-08-11 17:02:08.000000000","message":"do we need to check to descendant\u0027s path to make sure they got resetted?","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"f3556a9d8f5d3e29c710ae3b244ea151e7681fe3","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        session \u003d sql.get_session()"},{"line_number":144,"context_line":"        query \u003d session.query(ExampleMPModel)"},{"line_number":145,"context_line":"        self.assertEqual("},{"line_number":146,"context_line":"            2, query.filter(self.attached.descendants_filter).count())"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_5c296d88","line":146,"in_reply_to":"1a4dcd0f_9ecd6c33","updated":"2015-08-24 13:53:44.000000000","message":"agree, working on it","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"976d380cecb12553a81bd71964bc9b1563266731","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        session \u003d sql.get_session()"},{"line_number":144,"context_line":"        query \u003d session.query(ExampleMPModel)"},{"line_number":145,"context_line":"        self.assertEqual("},{"line_number":146,"context_line":"            2, query.filter(self.attached.descendants_filter).count())"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_9c5065d6","line":146,"in_reply_to":"fa1b9901_5c296d88","updated":"2015-08-24 13:58:29.000000000","message":"Done","commit_id":"852f1c9c189b3e3609b9a6e658d2b1d2a3f18a7f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9120ed3f2c252e038a31b5bd66ccf88491ec0212","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        config_files.append(tests.dirs.tests_conf(\u0027backend_sql.conf\u0027))"},{"line_number":94,"context_line":"        return config_files"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _create_node(self):"},{"line_number":97,"context_line":"        return ExampleMPModel(test_id\u003dutils.new_uuid(), text\u003dutils.new_uuid())"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _create_branch(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_9e733d4e","line":96,"updated":"2015-08-25 14:51:39.000000000","message":"missing description here, _create_branch has one.","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e86b92a6db8aa9177bfb1f807eaf037cda237e27","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        config_files.append(tests.dirs.tests_conf(\u0027backend_sql.conf\u0027))"},{"line_number":94,"context_line":"        return config_files"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _create_node(self):"},{"line_number":97,"context_line":"        return ExampleMPModel(test_id\u003dutils.new_uuid(), text\u003dutils.new_uuid())"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _create_branch(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_2e272db7","line":96,"in_reply_to":"fa1b9901_9e733d4e","updated":"2015-08-26 11:42:49.000000000","message":"Done","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9120ed3f2c252e038a31b5bd66ccf88491ec0212","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            session.add_all([a, b, c])"},{"line_number":109,"context_line":"        return a"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def test_append_branch(self):"},{"line_number":112,"context_line":"        self.assertEqual(self.tree.test_id, self.attached.parent.path)"},{"line_number":113,"context_line":"        expected_path \u003d ExampleMPModel.DELIMITER.join(("},{"line_number":114,"context_line":"            self.tree.test_id, self.attached.parent.test_id"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_3e847109","line":111,"updated":"2015-08-25 14:51:39.000000000","message":"nit: missing test description here, all the other tests have one.","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e86b92a6db8aa9177bfb1f807eaf037cda237e27","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            session.add_all([a, b, c])"},{"line_number":109,"context_line":"        return a"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def test_append_branch(self):"},{"line_number":112,"context_line":"        self.assertEqual(self.tree.test_id, self.attached.parent.path)"},{"line_number":113,"context_line":"        expected_path \u003d ExampleMPModel.DELIMITER.join(("},{"line_number":114,"context_line":"            self.tree.test_id, self.attached.parent.test_id"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_4e2ce198","line":111,"in_reply_to":"fa1b9901_3e847109","updated":"2015-08-26 11:42:49.000000000","message":"Done","commit_id":"a74453853cb1ac7e537b85dac55a31871a36b96e"}]}
