)]}'
{"vitrage/evaluator/scenario_repository.py":[{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"4f070a2f56999ef7cf00a5eacef457978bf17250","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                for entity in scenario.entities.values():"},{"line_number":96,"context_line":"                    self._add_to_entity(scenario, entity)"},{"line_number":97,"context_line":"                for relationship in scenario.relationships.values():"},{"line_number":98,"context_line":"                    self._add_to_relationship(scenario, relationship)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _load_templates_files(self, conf):"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ff0f0b1f_bdff2466","line":98,"range":{"start_line":98,"start_character":20,"end_line":98,"end_character":69},"updated":"2017-05-18 11:47:29.000000000","message":"In the original code when we got relationship we also added the entities, why here we shouldn\u0027t do that as well:\nself._add_relationship(scenario, edge_desc)\n                self._add_entity(scenario, edge_desc.source)\n                self._add_entity(scenario, edge_desc.target)","commit_id":"96cfd19d7a689456a63f544553d69ec188d37e38"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"1744bf8ff18b2eb947461449ea979fa38856cb01","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                for entity in scenario.entities.values():"},{"line_number":96,"context_line":"                    self._add_to_entity(scenario, entity)"},{"line_number":97,"context_line":"                for relationship in scenario.relationships.values():"},{"line_number":98,"context_line":"                    self._add_to_relationship(scenario, relationship)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _load_templates_files(self, conf):"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ff0f0b1f_2746567e","line":98,"range":{"start_line":98,"start_character":20,"end_line":98,"end_character":69},"in_reply_to":"ff0f0b1f_bdff2466","updated":"2017-05-18 16:18:41.000000000","message":"See explanation in document update","commit_id":"96cfd19d7a689456a63f544553d69ec188d37e38"}],"vitrage/evaluator/template_data.py":[{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"79105c18d1f54583da3c478f897c217dff5f9b41","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        return scenarios"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class ScenarioData(object):"},{"line_number":152,"context_line":"    def __init__(self, scenario_id, scenario_dict, template_data):"},{"line_number":153,"context_line":"        self._template_entities \u003d template_data.entities"},{"line_number":154,"context_line":"        self._template_relationships \u003d template_data.relationships"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # TODO(yujunz) export entities and relationships set for building"},{"line_number":157,"context_line":"        #              equivalent scenarios efficiently"},{"line_number":158,"context_line":"        self._entities \u003d {}"},{"line_number":159,"context_line":"        self._relationships \u003d {}"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        self.scenario_id \u003d scenario_id"},{"line_number":162,"context_line":"        self.condition \u003d self._parse_condition("},{"line_number":163,"context_line":"            scenario_dict[TFields.CONDITION])"},{"line_number":164,"context_line":"        self.actions \u003d self._build_actions(scenario_dict[TFields.ACTIONS])"},{"line_number":165,"context_line":"        self.subgraphs \u003d SubGraph.from_condition(self.condition,"},{"line_number":166,"context_line":"                                                 self._extract_var)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def __eq__(self, other):"},{"line_number":169,"context_line":"        return self.scenario_id \u003d\u003d other.scenario_id \\"},{"line_number":170,"context_line":"            and self.condition \u003d\u003d other.condition \\"},{"line_number":171,"context_line":"            and self.actions \u003d\u003d other.actions"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def to_tuple(self):"},{"line_number":174,"context_line":"        return Scenario(id\u003dself.scenario_id,"},{"line_number":175,"context_line":"                        condition\u003dself.condition,"},{"line_number":176,"context_line":"                        actions\u003dself.actions,"},{"line_number":177,"context_line":"                        subgraphs\u003dself.subgraphs,"},{"line_number":178,"context_line":"                        entities\u003dself._entities,"},{"line_number":179,"context_line":"                        relationships\u003dself._relationships)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @staticmethod"},{"line_number":182,"context_line":"    def _build_actions(actions_def):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_0a600cce","line":179,"range":{"start_line":151,"start_character":0,"end_line":179,"end_character":48},"updated":"2017-05-15 11:56:20.000000000","message":"isn\u0027t this class supposed to be indented by one tab? (because this is a nested class of TemplateData class that uses the TemplateData methods)\nAnd I also think that we should move this class to the end of the class instead of it being in the middle.","commit_id":"78308efe6d9506aff54fedd2d85db0014077055f"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"7a016bbfc7a812aae4d97ae17fe65cef9eab27db","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        return scenarios"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class ScenarioData(object):"},{"line_number":152,"context_line":"    def __init__(self, scenario_id, scenario_dict, template_data):"},{"line_number":153,"context_line":"        self._template_entities \u003d template_data.entities"},{"line_number":154,"context_line":"        self._template_relationships \u003d template_data.relationships"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # TODO(yujunz) export entities and relationships set for building"},{"line_number":157,"context_line":"        #              equivalent scenarios efficiently"},{"line_number":158,"context_line":"        self._entities \u003d {}"},{"line_number":159,"context_line":"        self._relationships \u003d {}"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        self.scenario_id \u003d scenario_id"},{"line_number":162,"context_line":"        self.condition \u003d self._parse_condition("},{"line_number":163,"context_line":"            scenario_dict[TFields.CONDITION])"},{"line_number":164,"context_line":"        self.actions \u003d self._build_actions(scenario_dict[TFields.ACTIONS])"},{"line_number":165,"context_line":"        self.subgraphs \u003d SubGraph.from_condition(self.condition,"},{"line_number":166,"context_line":"                                                 self._extract_var)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def __eq__(self, other):"},{"line_number":169,"context_line":"        return self.scenario_id \u003d\u003d other.scenario_id \\"},{"line_number":170,"context_line":"            and self.condition \u003d\u003d other.condition \\"},{"line_number":171,"context_line":"            and self.actions \u003d\u003d other.actions"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def to_tuple(self):"},{"line_number":174,"context_line":"        return Scenario(id\u003dself.scenario_id,"},{"line_number":175,"context_line":"                        condition\u003dself.condition,"},{"line_number":176,"context_line":"                        actions\u003dself.actions,"},{"line_number":177,"context_line":"                        subgraphs\u003dself.subgraphs,"},{"line_number":178,"context_line":"                        entities\u003dself._entities,"},{"line_number":179,"context_line":"                        relationships\u003dself._relationships)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @staticmethod"},{"line_number":182,"context_line":"    def _build_actions(actions_def):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_34a53405","line":179,"range":{"start_line":151,"start_character":0,"end_line":179,"end_character":48},"in_reply_to":"1f013ff3_0a600cce","updated":"2017-05-17 02:40:38.000000000","message":"Which method exactly?\n\nIt refers a parent template_data as parent object for entity and relationship lookup. But in fact, this lookup table can be injected without template_data.\n\nBy separating scenario data from template data, we will be able to build scenario dynamically. Equivalent scenario is one use case for such dynamic build.\n\nFor the position, I kept it in this place to highlight the changes. Otherwise it will look like a total rewriting. Let\u0027s move it after we agreed on content.","commit_id":"78308efe6d9506aff54fedd2d85db0014077055f"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"3149396f23455e607e4d4fcc955c725d39fed9f0","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        return scenarios"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class ScenarioData(object):"},{"line_number":152,"context_line":"    def __init__(self, scenario_id, scenario_dict, template_data):"},{"line_number":153,"context_line":"        self._template_entities \u003d template_data.entities"},{"line_number":154,"context_line":"        self._template_relationships \u003d template_data.relationships"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # TODO(yujunz) export entities and relationships set for building"},{"line_number":157,"context_line":"        #              equivalent scenarios efficiently"},{"line_number":158,"context_line":"        self._entities \u003d {}"},{"line_number":159,"context_line":"        self._relationships \u003d {}"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        self.scenario_id \u003d scenario_id"},{"line_number":162,"context_line":"        self.condition \u003d self._parse_condition("},{"line_number":163,"context_line":"            scenario_dict[TFields.CONDITION])"},{"line_number":164,"context_line":"        self.actions \u003d self._build_actions(scenario_dict[TFields.ACTIONS])"},{"line_number":165,"context_line":"        self.subgraphs \u003d SubGraph.from_condition(self.condition,"},{"line_number":166,"context_line":"                                                 self._extract_var)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def __eq__(self, other):"},{"line_number":169,"context_line":"        return self.scenario_id \u003d\u003d other.scenario_id \\"},{"line_number":170,"context_line":"            and self.condition \u003d\u003d other.condition \\"},{"line_number":171,"context_line":"            and self.actions \u003d\u003d other.actions"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def to_tuple(self):"},{"line_number":174,"context_line":"        return Scenario(id\u003dself.scenario_id,"},{"line_number":175,"context_line":"                        condition\u003dself.condition,"},{"line_number":176,"context_line":"                        actions\u003dself.actions,"},{"line_number":177,"context_line":"                        subgraphs\u003dself.subgraphs,"},{"line_number":178,"context_line":"                        entities\u003dself._entities,"},{"line_number":179,"context_line":"                        relationships\u003dself._relationships)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @staticmethod"},{"line_number":182,"context_line":"    def _build_actions(actions_def):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_f9d6daf1","line":179,"range":{"start_line":151,"start_character":0,"end_line":179,"end_character":48},"in_reply_to":"1f013ff3_34a53405","updated":"2017-05-18 05:49:27.000000000","message":"I meant the whole class should be inside the TemplateData class (nested class), and thus it should all be indented by one tab. \nIn addition I think that this class should be defined or at the end or at the beginning of the nested class.","commit_id":"78308efe6d9506aff54fedd2d85db0014077055f"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"79105c18d1f54583da3c478f897c217dff5f9b41","unresolved":false,"context_lines":[{"line_number":259,"context_line":"    def _extract_condition_var(self, symbol, positive):"},{"line_number":260,"context_line":"        if isinstance(symbol, Not):"},{"line_number":261,"context_line":"            return self._extract_not_condition_var(symbol)[0]"},{"line_number":262,"context_line":"        return ConditionVar(symbol.name, positive)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _extract_var(self, symbol_name):"},{"line_number":265,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_c5d7b723","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":50},"updated":"2017-05-15 11:56:20.000000000","message":"Before we returned here the details of the entity and now you return only the vitrage_id (symbol,name). are you sure that everything is working? (have you made the change in all of the places that used the ConditionVar with the previous data? (because I dont see it here)","commit_id":"78308efe6d9506aff54fedd2d85db0014077055f"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"7a016bbfc7a812aae4d97ae17fe65cef9eab27db","unresolved":false,"context_lines":[{"line_number":259,"context_line":"    def _extract_condition_var(self, symbol, positive):"},{"line_number":260,"context_line":"        if isinstance(symbol, Not):"},{"line_number":261,"context_line":"            return self._extract_not_condition_var(symbol)[0]"},{"line_number":262,"context_line":"        return ConditionVar(symbol.name, positive)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _extract_var(self, symbol_name):"},{"line_number":265,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_14aeb897","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":50},"in_reply_to":"1f013ff3_c5d7b723","updated":"2017-05-17 02:40:38.000000000","message":"It seems ConditionVar is referred in subgraph build and only in it. Variable extraction is moved to subgraph build.\n\nScenario evaluation is based on subgraph, if I understand it correctly.","commit_id":"78308efe6d9506aff54fedd2d85db0014077055f"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"79105c18d1f54583da3c478f897c217dff5f9b41","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            return self._extract_not_condition_var(symbol)[0]"},{"line_number":262,"context_line":"        return ConditionVar(symbol.name, positive)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _extract_var(self, symbol_name):"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if symbol_name in self._template_relationships:"},{"line_number":267,"context_line":"            relationship \u003d self._template_relationships[symbol_name]"},{"line_number":268,"context_line":"            self._relationships[symbol_name] \u003d relationship"},{"line_number":269,"context_line":"            self._entities.update({"},{"line_number":270,"context_line":"                relationship.edge.source_id: relationship.source,"},{"line_number":271,"context_line":"                relationship.edge.target_id: relationship.target"},{"line_number":272,"context_line":"            })"},{"line_number":273,"context_line":"            return relationship, RELATIONSHIP"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        entity \u003d self._template_entities[symbol_name]"},{"line_number":276,"context_line":"        self._entities[symbol_name] \u003d entity"},{"line_number":277,"context_line":"        return entity, ENTITY"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"class SubGraph(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_a5270b65","line":277,"range":{"start_line":264,"start_character":0,"end_line":277,"end_character":29},"updated":"2017-05-15 11:56:20.000000000","message":"you have removed the usage of _extract_var from _extract_condition_var which was the only usage of that method.","commit_id":"78308efe6d9506aff54fedd2d85db0014077055f"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"7a016bbfc7a812aae4d97ae17fe65cef9eab27db","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            return self._extract_not_condition_var(symbol)[0]"},{"line_number":262,"context_line":"        return ConditionVar(symbol.name, positive)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _extract_var(self, symbol_name):"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if symbol_name in self._template_relationships:"},{"line_number":267,"context_line":"            relationship \u003d self._template_relationships[symbol_name]"},{"line_number":268,"context_line":"            self._relationships[symbol_name] \u003d relationship"},{"line_number":269,"context_line":"            self._entities.update({"},{"line_number":270,"context_line":"                relationship.edge.source_id: relationship.source,"},{"line_number":271,"context_line":"                relationship.edge.target_id: relationship.target"},{"line_number":272,"context_line":"            })"},{"line_number":273,"context_line":"            return relationship, RELATIONSHIP"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        entity \u003d self._template_entities[symbol_name]"},{"line_number":276,"context_line":"        self._entities[symbol_name] \u003d entity"},{"line_number":277,"context_line":"        return entity, ENTITY"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"class SubGraph(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_5409e092","line":277,"range":{"start_line":264,"start_character":0,"end_line":277,"end_character":29},"in_reply_to":"1f013ff3_a5270b65","updated":"2017-05-17 02:40:38.000000000","message":"It is passed as callback in L165 to delay the variable extraction to subgraph build.","commit_id":"78308efe6d9506aff54fedd2d85db0014077055f"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"4f070a2f56999ef7cf00a5eacef457978bf17250","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        return scenarios"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class ScenarioData(object):"},{"line_number":151,"context_line":"    def __init__(self, scenario_id, scenario_dict, template_data):"},{"line_number":152,"context_line":"        self._template_entities \u003d template_data.entities"},{"line_number":153,"context_line":"        self._template_relationships \u003d template_data.relationships"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # TODO(yujunz) export entities and relationships set for building"},{"line_number":156,"context_line":"        #              equivalent scenarios efficiently"},{"line_number":157,"context_line":"        self._entities \u003d {}"},{"line_number":158,"context_line":"        self._relationships \u003d {}"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        self.scenario_id \u003d scenario_id"},{"line_number":161,"context_line":"        self.condition \u003d self._parse_condition("},{"line_number":162,"context_line":"            scenario_dict[TFields.CONDITION])"},{"line_number":163,"context_line":"        self.actions \u003d self._build_actions(scenario_dict[TFields.ACTIONS])"},{"line_number":164,"context_line":"        self.subgraphs \u003d SubGraph.from_condition(self.condition,"},{"line_number":165,"context_line":"                                                 self._extract_var)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def __eq__(self, other):"},{"line_number":168,"context_line":"        return self.scenario_id \u003d\u003d other.scenario_id \\"},{"line_number":169,"context_line":"            and self.condition \u003d\u003d other.condition \\"},{"line_number":170,"context_line":"            and self.actions \u003d\u003d other.actions"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def to_tuple(self):"},{"line_number":173,"context_line":"        return Scenario(id\u003dself.scenario_id,"},{"line_number":174,"context_line":"                        condition\u003dself.condition,"},{"line_number":175,"context_line":"                        actions\u003dself.actions,"},{"line_number":176,"context_line":"                        subgraphs\u003dself.subgraphs,"},{"line_number":177,"context_line":"                        entities\u003dself._entities,"},{"line_number":178,"context_line":"                        relationships\u003dself._relationships)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @staticmethod"},{"line_number":181,"context_line":"    def _build_actions(actions_def):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff0f0b1f_e07a8f86","line":178,"range":{"start_line":150,"start_character":0,"end_line":178,"end_character":42},"updated":"2017-05-18 11:47:29.000000000","message":"Yujun,\nThis class has to be indented by one tab, so it will be a nested class in TemplateData.","commit_id":"96cfd19d7a689456a63f544553d69ec188d37e38"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"4f070a2f56999ef7cf00a5eacef457978bf17250","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        return entity, ENTITY"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"class SubGraph(object):"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @classmethod"},{"line_number":282,"context_line":"    def from_condition(cls, condition, extract_var):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff0f0b1f_3d59d459","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":23},"updated":"2017-05-18 11:47:29.000000000","message":"what is the reason that this class is not a nested class in TemplateData? What is the benefit from that?\nIf it will be nested in TemplateData, then _extract_var won\u0027t be needed to be transfered to the Subgraph class","commit_id":"96cfd19d7a689456a63f544553d69ec188d37e38"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"740a715559b8e5c3544199eed55a460affff60f6","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        return entity, ENTITY"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"class SubGraph(object):"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @classmethod"},{"line_number":282,"context_line":"    def from_condition(cls, condition, extract_var):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff0f0b1f_8dc66367","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":23},"in_reply_to":"ff0f0b1f_3d59d459","updated":"2017-05-18 16:26:37.000000000","message":"In equivalent scenario, the variable is not extracted from template, but the equivalence. So we need to include ``extract_var`` as a callback.","commit_id":"96cfd19d7a689456a63f544553d69ec188d37e38"}]}
