)]}'
{"ceilometer/storage/impl_hbase.py":[{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"657911fb252a7bae6620bb7e3f5ca0d046e6e3cf","unresolved":false,"context_lines":[{"line_number":618,"context_line":""},{"line_number":619,"context_line":"        :param events_models: a list of models.Event objects."},{"line_number":620,"context_line":"        \"\"\""},{"line_number":621,"context_line":"        for event_model in event_models:"},{"line_number":622,"context_line":"            with self.conn_pool.connection() as conn:"},{"line_number":623,"context_line":"                events_table \u003d conn.table(EVENTS_TABLE)"},{"line_number":624,"context_line":"                raise Exception(event_model.event_type)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad9bd40_0f8ab669","line":621,"updated":"2014-05-06 14:04:28.000000000","message":"it will be much more efficient if you use one connection for all events. So please move line 621 after 624","commit_id":"19ef5be900960945c51a069e619a9beaec8e12e4"},{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"b0f67398b9d6501cd28f281b516de9e9739bca36","unresolved":false,"context_lines":[{"line_number":621,"context_line":"        for event_model in event_models:"},{"line_number":622,"context_line":"            with self.conn_pool.connection() as conn:"},{"line_number":623,"context_line":"                events_table \u003d conn.table(EVENTS_TABLE)"},{"line_number":624,"context_line":"                raise Exception(event_model.event_type)"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"                # Rowkey consists of reversed timestamp and message_id"},{"line_number":627,"context_line":"                # from models.Event for purposes of sorting alphabetically."}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad9bd40_a60d5dea","line":624,"updated":"2014-05-07 11:42:45.000000000","message":"It raises always and code below this line is not executed","commit_id":"19ef5be900960945c51a069e619a9beaec8e12e4"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"ad1c30f07d0d5eee3b5a44a244ce2f1c2782e090","unresolved":false,"context_lines":[{"line_number":122,"context_line":"             if not determined"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    - events"},{"line_number":125,"context_line":"      - raw_key: reversed timestamp of event\u0027s generation + uuid of event"},{"line_number":126,"context_line":"                 in format: \"%s+%s\" % (rts, Event.message_id)"},{"line_number":127,"context_line":"      -Column Families:"},{"line_number":128,"context_line":"          f: contains the following qualifiers:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_dcfe6238","line":125,"updated":"2014-05-27 09:38:19.000000000","message":"I guess row_key, not raw_key)","commit_id":"44a430bc8400057f5621cc5df099ecdf450874ac"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"ad1c30f07d0d5eee3b5a44a244ce2f1c2782e090","unresolved":false,"context_lines":[{"line_number":647,"context_line":"                for key, value in events_dict.items():"},{"line_number":648,"context_line":"                    if not key.startswith(\u0027event_type\u0027):"},{"line_number":649,"context_line":"                        trait_name, trait_dtype \u003d key.split(\u0027+\u0027)"},{"line_number":650,"context_line":"                        traits.append(models.Trait(name\u003dtrait_name, dtype\u003dtrait_dtype, value\u003dvalue))"},{"line_number":651,"context_line":"                rts, mess \u003d event_id.split(\u0027_\u0027, 1)"},{"line_number":652,"context_line":"                events.append(models.Event("},{"line_number":653,"context_line":"                    message_id\u003dmess,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_5c4fb292","line":650,"updated":"2014-05-27 09:38:19.000000000","message":"I\u0027m pretty sure it does not fit 80 symbols here - it won\u0027t pass pep8... And well - there is a pack of pep8 errors in the log, please fix them all.","commit_id":"44a430bc8400057f5621cc5df099ecdf450874ac"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"32c476f23ba911db2bae351161fbf50efe493350","unresolved":false,"context_lines":[{"line_number":654,"context_line":"                    event_type\u003devents_dict[\u0027event_type\u0027],"},{"line_number":655,"context_line":"                    generated\u003dorigin_timestamp(rts),"},{"line_number":656,"context_line":"                    traits\u003dtraits"},{"line_number":657,"context_line":"                ))"},{"line_number":658,"context_line":"        return events[::-1]"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_d068d789","line":657,"updated":"2014-05-22 09:55:48.000000000","message":"So do you need only one event?","commit_id":"44a430bc8400057f5621cc5df099ecdf450874ac"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"c1d5b623e2e90076747571fa3be1e80990a72aec","unresolved":false,"context_lines":[{"line_number":654,"context_line":"                    event_type\u003devents_dict[\u0027event_type\u0027],"},{"line_number":655,"context_line":"                    generated\u003dorigin_timestamp(rts),"},{"line_number":656,"context_line":"                    traits\u003dtraits"},{"line_number":657,"context_line":"                ))"},{"line_number":658,"context_line":"        return events[::-1]"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_8136ffe5","line":657,"in_reply_to":"7adec928_d068d789","updated":"2014-05-22 11:33:55.000000000","message":"Not one but reverse list of events.","commit_id":"44a430bc8400057f5621cc5df099ecdf450874ac"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"32c476f23ba911db2bae351161fbf50efe493350","unresolved":false,"context_lines":[{"line_number":807,"context_line":"    td \u003d dt - epoch"},{"line_number":808,"context_line":"    ts \u003d td.microseconds + td.seconds * 1000000 + td.days * 86400000000"},{"line_number":809,"context_line":"    return 0x7fffffffffffffff - ts"},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"def origin_timestamp(rts):"},{"line_number":812,"context_line":"    \"\"\"Return origin timestamp from reversed timestamp."},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_b0b8ab2b","line":810,"updated":"2014-05-22 09:55:48.000000000","message":"I\u0027m a little bit confused of this method. Are you sure that you need it? First of all, I\u0027m not sure that \u0027reverting\u0027 timestamps is needed in Hbase implementation at all. Second, you may just store timestamp in HBase as it done for meters","commit_id":"44a430bc8400057f5621cc5df099ecdf450874ac"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"32c476f23ba911db2bae351161fbf50efe493350","unresolved":false,"context_lines":[{"line_number":822,"context_line":"    sec, microsec \u003d divmod(time, 1000000)"},{"line_number":823,"context_line":"    td \u003d datetime.timedelta(days, sec, microsec)"},{"line_number":824,"context_line":"    return td + epoch"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"def make_events_query_from_filter(event_filter):"},{"line_number":827,"context_line":"    \"\"\"Return start and stop row for filtering and a query"},{"line_number":828,"context_line":"    which based ..."}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_b01c2b6c","line":825,"updated":"2014-05-22 09:55:48.000000000","message":"The result of \u0027make_events_query...\u0027 is not actually a query now. It\u0027s start and stop row for scanning. Are you gonna use other params from event_filter to create a query?\nBesides, it would be great not to create additional methods for new entities but refactor existing. make_timestamp_query looks appropriate for your case","commit_id":"44a430bc8400057f5621cc5df099ecdf450874ac"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"c1d5b623e2e90076747571fa3be1e80990a72aec","unresolved":false,"context_lines":[{"line_number":822,"context_line":"    sec, microsec \u003d divmod(time, 1000000)"},{"line_number":823,"context_line":"    td \u003d datetime.timedelta(days, sec, microsec)"},{"line_number":824,"context_line":"    return td + epoch"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"def make_events_query_from_filter(event_filter):"},{"line_number":827,"context_line":"    \"\"\"Return start and stop row for filtering and a query"},{"line_number":828,"context_line":"    which based ..."}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_2612a162","line":825,"in_reply_to":"7adec928_b01c2b6c","updated":"2014-05-22 11:33:55.000000000","message":"Actually I am going to use filters from event_filter to create query. So it is just the draft of the function.","commit_id":"44a430bc8400057f5621cc5df099ecdf450874ac"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        problem_events \u003d []"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"        for event_model in event_models:"},{"line_number":571,"context_line":"            # Rowkey consists of reversed timestamp and message_id"},{"line_number":572,"context_line":"            # from models.Event for purposes of sorting alphabetically."},{"line_number":573,"context_line":"            rts \u003d reverse_timestamp(event_model.generated)"},{"line_number":574,"context_line":"            row \u003d \"%d_%s\" % (rts, event_model.message_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_873ffa24","line":571,"updated":"2014-05-28 10:14:06.000000000","message":"This comment is not correct. HBase always stored rows in alphabetical order. The question is \u0027why do you need alphabetical order for timestamps\u0027?  If you store rts_message_id then the most new event will be the \"first\" and that\u0027s the purpose to store in this way","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        problem_events \u003d []"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"        for event_model in event_models:"},{"line_number":571,"context_line":"            # Rowkey consists of reversed timestamp and message_id"},{"line_number":572,"context_line":"            # from models.Event for purposes of sorting alphabetically."},{"line_number":573,"context_line":"            rts \u003d reverse_timestamp(event_model.generated)"},{"line_number":574,"context_line":"            row \u003d \"%d_%s\" % (rts, event_model.message_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_8f3710e3","line":571,"in_reply_to":"3ae8d1ca_873ffa24","updated":"2014-05-29 13:38:42.000000000","message":"Yes, you are right.\n\nDone","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    key \u003d \"%s+%d\" % (trait.name, trait.dtype)"},{"line_number":581,"context_line":"                    traits[key] \u003d trait.value"},{"line_number":582,"context_line":"            record \u003d serialize_entry(traits, **{\u0027event_type\u0027: event_type,"},{"line_number":583,"context_line":"                                                \u0027timestamp\u0027: ts})"},{"line_number":584,"context_line":"            with self.conn_pool.connection() as conn:"},{"line_number":585,"context_line":"                events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":586,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_27954633","line":583,"updated":"2014-05-28 10:14:06.000000000","message":"I think that \u0027with\u0027 block should be up","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    key \u003d \"%s+%d\" % (trait.name, trait.dtype)"},{"line_number":581,"context_line":"                    traits[key] \u003d trait.value"},{"line_number":582,"context_line":"            record \u003d serialize_entry(traits, **{\u0027event_type\u0027: event_type,"},{"line_number":583,"context_line":"                                                \u0027timestamp\u0027: ts})"},{"line_number":584,"context_line":"            with self.conn_pool.connection() as conn:"},{"line_number":585,"context_line":"                events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":586,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_1ef40cf1","line":583,"in_reply_to":"3ae8d1ca_27954633","updated":"2014-05-29 13:38:42.000000000","message":"I think we don\u0027t need connection with db before we have prepared data for record, do we?","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":620,"context_line":"                event_type\u003devents_dict[\u0027event_type\u0027],"},{"line_number":621,"context_line":"                generated\u003devents_dict[\u0027timestamp\u0027],"},{"line_number":622,"context_line":"                traits\u003dtraits"},{"line_number":623,"context_line":"            ))"},{"line_number":624,"context_line":"        return events[::-1]"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def get_event_types(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_a786b6b7","line":623,"updated":"2014-05-28 10:14:06.000000000","message":"Why do we revert? Sorry if I repeat the question but it\u0027s not correct to store all events in \u0027events\u0027 variable because we may have too many events. If you need to revert then I guess you should just change the strategy of storing: not rts_message_id but ts_message_id.","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"6b544086dcb5833e8114ec8f28dfda46742120ec","unresolved":false,"context_lines":[{"line_number":620,"context_line":"                event_type\u003devents_dict[\u0027event_type\u0027],"},{"line_number":621,"context_line":"                generated\u003devents_dict[\u0027timestamp\u0027],"},{"line_number":622,"context_line":"                traits\u003dtraits"},{"line_number":623,"context_line":"            ))"},{"line_number":624,"context_line":"        return events[::-1]"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def get_event_types(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_a1b6c888","line":623,"in_reply_to":"3ae8d1ca_3242df10","updated":"2014-05-30 11:12:36.000000000","message":"I have changed row_key from rts_message_id --\u003e ts_message_id\n\nSo it is not need any more to change any tests that are used get_events method","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":620,"context_line":"                event_type\u003devents_dict[\u0027event_type\u0027],"},{"line_number":621,"context_line":"                generated\u003devents_dict[\u0027timestamp\u0027],"},{"line_number":622,"context_line":"                traits\u003dtraits"},{"line_number":623,"context_line":"            ))"},{"line_number":624,"context_line":"        return events[::-1]"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def get_event_types(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_3242df10","line":623,"in_reply_to":"3ae8d1ca_a786b6b7","updated":"2014-05-29 13:38:42.000000000","message":"Thanks for your question. Actually in this method I have based on the implementation of events on SQL backend, where get_event function returns events list sorted by generated time. And storage.scenario tests are required sorted list of events. So I have to revert events after scanning database. \n\nIf we will store events with row_key ts_message_id and change strategy of storing we won\u0027t have more recent events to be \"first\" in db and I think it won\u0027t be correct. May be good decision will be to improve tests to do them not event\u0027s list sorting sensitive?","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        for event_id, data in gen:"},{"line_number":635,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":636,"context_line":"            for key, value in events_dict.items():"},{"line_number":637,"context_line":"                if key.startswith(\u0027event_type\u0027):"},{"line_number":638,"context_line":"                    event_types.add(value)"},{"line_number":639,"context_line":"        return event_types"},{"line_number":640,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_e7551e1e","line":637,"updated":"2014-05-28 10:14:06.000000000","message":"why don\u0027t you use \u0027yeild\u0027 here too?","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        for event_id, data in gen:"},{"line_number":635,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":636,"context_line":"            for key, value in events_dict.items():"},{"line_number":637,"context_line":"                if key.startswith(\u0027event_type\u0027):"},{"line_number":638,"context_line":"                    event_types.add(value)"},{"line_number":639,"context_line":"        return event_types"},{"line_number":640,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_9292d355","line":637,"in_reply_to":"3ae8d1ca_e7551e1e","updated":"2014-05-29 13:38:42.000000000","message":"of course I can use \u0027yield\u0027 here, but it requires one more \u0027for\u0027 cycle to go through all \u0027event_types\u0027 items. I prefer to make code shorter.","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":657,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":658,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":659,"context_line":"                    data_type \u003d models.Trait.type_names[int(tt_number)]"},{"line_number":660,"context_line":"                    tt_dict.update({desc: data_type})"},{"line_number":661,"context_line":"        for name, d_type in tt_dict.items():"},{"line_number":662,"context_line":"            yield {\u0027name\u0027: name, \u0027data_type\u0027: d_type}"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_192c2e99","line":659,"updated":"2014-05-28 10:14:06.000000000","message":"why don\u0027t you do yield right here? What should happen if several data_types corresponds to one description?","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":657,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":658,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":659,"context_line":"                    data_type \u003d models.Trait.type_names[int(tt_number)]"},{"line_number":660,"context_line":"                    tt_dict.update({desc: data_type})"},{"line_number":661,"context_line":"        for name, d_type in tt_dict.items():"},{"line_number":662,"context_line":"            yield {\u0027name\u0027: name, \u0027data_type\u0027: d_type}"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_682d5346","line":659,"in_reply_to":"3ae8d1ca_192c2e99","updated":"2014-05-29 13:38:42.000000000","message":"yield couldn\u0027t be implemented right here because in this case method will return all traits type with the same description and type, but nevertheless you are right and case when several data_types corresponds to one description could happened.\n\nI will improve it.","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        \"\"\""},{"line_number":671,"context_line":"        traits \u003d []"},{"line_number":672,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type})"},{"line_number":673,"context_line":"        if trait_type:"},{"line_number":674,"context_line":"            q +\u003d \" AND ColumnPrefixFilter(\u0027%s\u0027)\" % trait_type"},{"line_number":675,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":676,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_19950e33","line":673,"updated":"2014-05-28 10:14:06.000000000","message":"It should be moved somewhere imho. It\u0027s part of query construction and we need to keep \u0027get\u0027 methods clean from it. I guess you need refactor \u0027make_query\u0027. Besides, you need to implement this new filter type in mocked HBase. Tests are failing because of it","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        \"\"\""},{"line_number":671,"context_line":"        traits \u003d []"},{"line_number":672,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type})"},{"line_number":673,"context_line":"        if trait_type:"},{"line_number":674,"context_line":"            q +\u003d \" AND ColumnPrefixFilter(\u0027%s\u0027)\" % trait_type"},{"line_number":675,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":676,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_32e81fb4","line":673,"in_reply_to":"3ae8d1ca_19950e33","updated":"2014-05-29 13:38:42.000000000","message":"Thank you for comment. I will improve this method.","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"6b544086dcb5833e8114ec8f28dfda46742120ec","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        \"\"\""},{"line_number":671,"context_line":"        traits \u003d []"},{"line_number":672,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type})"},{"line_number":673,"context_line":"        if trait_type:"},{"line_number":674,"context_line":"            q +\u003d \" AND ColumnPrefixFilter(\u0027%s\u0027)\" % trait_type"},{"line_number":675,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":676,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_e17610d8","line":673,"in_reply_to":"3ae8d1ca_32e81fb4","updated":"2014-05-30 11:12:36.000000000","message":"Done","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":682,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":683,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":684,"context_line":"                    traits.append(models.Trait(name\u003ddesc, dtype\u003dint(tt_number),"},{"line_number":685,"context_line":"                                               value\u003dvalue))"},{"line_number":686,"context_line":"        return sorted(traits, key\u003d(lambda item: getattr(item, \u0027name\u0027)))"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_59823650","line":685,"updated":"2014-05-28 10:14:06.000000000","message":"it really should be sorted by name :(?","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":682,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":683,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":684,"context_line":"                    traits.append(models.Trait(name\u003ddesc, dtype\u003dint(tt_number),"},{"line_number":685,"context_line":"                                               value\u003dvalue))"},{"line_number":686,"context_line":"        return sorted(traits, key\u003d(lambda item: getattr(item, \u0027name\u0027)))"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_e82b2ae9","line":685,"in_reply_to":"3ae8d1ca_59823650","updated":"2014-05-29 13:38:42.000000000","message":"actually no, sort was used to go through tests. I\u0027m going to improve this. tests have been written for SQL backend and require from get_traits method to return traits in order they were stored. \n\nin our case it seems that we couldn\u0027t get data from db in order it was stored, so it could be necessary improve tests to do them not sensitive to any order?","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":846,"context_line":"    :param event_filter: storage.EventFilter object."},{"line_number":847,"context_line":"    \"\"\""},{"line_number":848,"context_line":"    q \u003d []"},{"line_number":849,"context_line":"    res_q \u003d None"},{"line_number":850,"context_line":"    start \u003d \"%s\" % (reverse_timestamp(event_filter.end_time)"},{"line_number":851,"context_line":"                    if event_filter.end_time else \"\")"},{"line_number":852,"context_line":"    stop \u003d \"%s\" % ((reverse_timestamp(event_filter.start_time) + 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_19d98e57","line":849,"updated":"2014-05-28 10:14:06.000000000","message":"Why don\u0027t you use \u0027make_timestamp_query\u0027 with bounds_only\u003dtrue?","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":846,"context_line":"    :param event_filter: storage.EventFilter object."},{"line_number":847,"context_line":"    \"\"\""},{"line_number":848,"context_line":"    q \u003d []"},{"line_number":849,"context_line":"    res_q \u003d None"},{"line_number":850,"context_line":"    start \u003d \"%s\" % (reverse_timestamp(event_filter.end_time)"},{"line_number":851,"context_line":"                    if event_filter.end_time else \"\")"},{"line_number":852,"context_line":"    stop \u003d \"%s\" % ((reverse_timestamp(event_filter.start_time) + 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_d402843d","line":849,"in_reply_to":"3ae8d1ca_19d98e57","updated":"2014-05-29 13:38:42.000000000","message":"we couldn\u0027t use \u0027make_timestamp_query\u0027 because internal function \u0027_make_general_rowkey_scan\u0027 is not suitable for this case  and it will require to write another one.\n\nAs for me this version is rather laconically","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":928,"context_line":"     column name in db"},{"line_number":929,"context_line":"    \"\"\""},{"line_number":930,"context_line":"    q \u003d []"},{"line_number":931,"context_line":"    res_q \u003d None"},{"line_number":932,"context_line":"    # Note: we use extended constructor for SingleColumnValueFilter here."},{"line_number":933,"context_line":"    # It is explicitly specified that entry should not be returned if CF is not"},{"line_number":934,"context_line":"    # found in table."}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_19d6ee4f","line":931,"updated":"2014-05-28 10:14:06.000000000","message":"Please move this comment to an appropriate place","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4350ceffdbde4813473325d3a9fe4043fc82b415","unresolved":false,"context_lines":[{"line_number":928,"context_line":"     column name in db"},{"line_number":929,"context_line":"    \"\"\""},{"line_number":930,"context_line":"    q \u003d []"},{"line_number":931,"context_line":"    res_q \u003d None"},{"line_number":932,"context_line":"    # Note: we use extended constructor for SingleColumnValueFilter here."},{"line_number":933,"context_line":"    # It is explicitly specified that entry should not be returned if CF is not"},{"line_number":934,"context_line":"    # found in table."}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_e8124ab3","line":931,"in_reply_to":"3ae8d1ca_19d6ee4f","updated":"2014-05-29 13:38:42.000000000","message":"thanks, I\u0027ll move it","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"6b544086dcb5833e8114ec8f28dfda46742120ec","unresolved":false,"context_lines":[{"line_number":928,"context_line":"     column name in db"},{"line_number":929,"context_line":"    \"\"\""},{"line_number":930,"context_line":"    q \u003d []"},{"line_number":931,"context_line":"    res_q \u003d None"},{"line_number":932,"context_line":"    # Note: we use extended constructor for SingleColumnValueFilter here."},{"line_number":933,"context_line":"    # It is explicitly specified that entry should not be returned if CF is not"},{"line_number":934,"context_line":"    # found in table."}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_21f1d8cd","line":931,"in_reply_to":"3ae8d1ca_e8124ab3","updated":"2014-05-30 11:12:36.000000000","message":"Done","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5c1fc8db73b0077f4dea6f1fa729b8e31d1cf4cd","unresolved":false,"context_lines":[{"line_number":932,"context_line":"    # Note: we use extended constructor for SingleColumnValueFilter here."},{"line_number":933,"context_line":"    # It is explicitly specified that entry should not be returned if CF is not"},{"line_number":934,"context_line":"    # found in table."},{"line_number":935,"context_line":"    if trait_query:  # trait query"},{"line_number":936,"context_line":"        dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027datetime\u0027: 3,"},{"line_number":937,"context_line":"                       \u0027float\u0027: 4}"},{"line_number":938,"context_line":"        op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_79ca9250","line":935,"updated":"2014-05-28 10:14:06.000000000","message":"Please add more comments here","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"6b544086dcb5833e8114ec8f28dfda46742120ec","unresolved":false,"context_lines":[{"line_number":932,"context_line":"    # Note: we use extended constructor for SingleColumnValueFilter here."},{"line_number":933,"context_line":"    # It is explicitly specified that entry should not be returned if CF is not"},{"line_number":934,"context_line":"    # found in table."},{"line_number":935,"context_line":"    if trait_query:  # trait query"},{"line_number":936,"context_line":"        dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027datetime\u0027: 3,"},{"line_number":937,"context_line":"                       \u0027float\u0027: 4}"},{"line_number":938,"context_line":"        op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_01e4dc0b","line":935,"in_reply_to":"3ae8d1ca_79ca9250","updated":"2014-05-30 11:12:36.000000000","message":"Done","commit_id":"87a00d75e8545c4073af6079a8dbc85c64fdf7de"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    RESOURCE_TABLE \u003d \"resource\""},{"line_number":129,"context_line":"    METER_TABLE \u003d \"meter\""},{"line_number":130,"context_line":"    ALARM_TABLE \u003d \"alarm\""},{"line_number":131,"context_line":"    ALARM_HISTORY_TABLE \u003d \"alarm_h\""},{"line_number":132,"context_line":"    EVENTS_TABLE \u003d \"events\""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def __init__(self, url):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_56af9f7c","line":131,"updated":"2014-06-06 12:54:30.000000000","message":"let\u0027s call it \u0027event\u0027, because all table names are singular. And variable EVENT_TABLE instead of EVENTS_TABLE","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    RESOURCE_TABLE \u003d \"resource\""},{"line_number":129,"context_line":"    METER_TABLE \u003d \"meter\""},{"line_number":130,"context_line":"    ALARM_TABLE \u003d \"alarm\""},{"line_number":131,"context_line":"    ALARM_HISTORY_TABLE \u003d \"alarm_h\""},{"line_number":132,"context_line":"    EVENTS_TABLE \u003d \"events\""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def __init__(self, url):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_2c500431","line":131,"in_reply_to":"1ae5cdf2_56af9f7c","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9441eff8a3a52fbb269e1e841f48c07918ac6649","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        return results"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    def record_events(self, event_models):"},{"line_number":562,"context_line":"        \"\"\"Write the events to Hbase"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        :param event_models: a list of models.Event objects."},{"line_number":565,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_e770f709","line":562,"updated":"2014-06-06 13:34:30.000000000","message":"please place dot in the end of this line","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        return results"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    def record_events(self, event_models):"},{"line_number":562,"context_line":"        \"\"\"Write the events to Hbase"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        :param event_models: a list of models.Event objects."},{"line_number":565,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_9bcceb8c","line":562,"in_reply_to":"1ae5cdf2_e770f709","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        \"\"\""},{"line_number":566,"context_line":"        problem_events \u003d []"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        for event_model in event_models:"},{"line_number":569,"context_line":"            # Row key consists of timestamp and message_id from"},{"line_number":570,"context_line":"            #models.Event for purposes of storage event sorted by timestamp"},{"line_number":571,"context_line":"            #in the database."}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_96fa0773","line":568,"updated":"2014-06-06 12:54:30.000000000","message":"Please correct spaces at the start of new lines in this comment","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        \"\"\""},{"line_number":566,"context_line":"        problem_events \u003d []"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        for event_model in event_models:"},{"line_number":569,"context_line":"            # Row key consists of timestamp and message_id from"},{"line_number":570,"context_line":"            #models.Event for purposes of storage event sorted by timestamp"},{"line_number":571,"context_line":"            #in the database."}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_c753fbdf","line":568,"in_reply_to":"1ae5cdf2_96fa0773","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        for event_model in event_models:"},{"line_number":569,"context_line":"            # Row key consists of timestamp and message_id from"},{"line_number":570,"context_line":"            #models.Event for purposes of storage event sorted by timestamp"},{"line_number":571,"context_line":"            #in the database."},{"line_number":572,"context_line":"            ts \u003d timestamp(event_model.generated)"},{"line_number":573,"context_line":"            row \u003d \"%d_%s\" % (ts, event_model.message_id)"},{"line_number":574,"context_line":"            event_type \u003d event_model.event_type"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_1698b71a","line":571,"updated":"2014-06-06 12:54:30.000000000","message":"I prefer not to use the same variables for different types. I suggest do the following:\nts \u003d event_model.generated\nrow \u003d \"%d_%s\" % (timestamp(ts), event_model.message_id)","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        for event_model in event_models:"},{"line_number":569,"context_line":"            # Row key consists of timestamp and message_id from"},{"line_number":570,"context_line":"            #models.Event for purposes of storage event sorted by timestamp"},{"line_number":571,"context_line":"            #in the database."},{"line_number":572,"context_line":"            ts \u003d timestamp(event_model.generated)"},{"line_number":573,"context_line":"            row \u003d \"%d_%s\" % (ts, event_model.message_id)"},{"line_number":574,"context_line":"            event_type \u003d event_model.event_type"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_a7f6efd4","line":571,"in_reply_to":"1ae5cdf2_1698b71a","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    traits[key] \u003d trait.value"},{"line_number":581,"context_line":"            record \u003d serialize_entry(traits, **{\u0027event_type\u0027: event_type,"},{"line_number":582,"context_line":"                                                \u0027timestamp\u0027: ts})"},{"line_number":583,"context_line":"            with self.conn_pool.connection() as conn:"},{"line_number":584,"context_line":"                events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":585,"context_line":"                try:"},{"line_number":586,"context_line":"                    events_table.put(row, record)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_f116f547","line":583,"updated":"2014-06-06 12:54:30.000000000","message":"in previous patch you asked: \"I think we don\u0027t need connection with db before we have prepared data for record, do we?\". But this method for recording events and I cannot imagine scenario when we don\u0027t need the connection. I think that connection instantiation should be moved up","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    traits[key] \u003d trait.value"},{"line_number":581,"context_line":"            record \u003d serialize_entry(traits, **{\u0027event_type\u0027: event_type,"},{"line_number":582,"context_line":"                                                \u0027timestamp\u0027: ts})"},{"line_number":583,"context_line":"            with self.conn_pool.connection() as conn:"},{"line_number":584,"context_line":"                events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":585,"context_line":"                try:"},{"line_number":586,"context_line":"                    events_table.put(row, record)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_c7013bb0","line":583,"in_reply_to":"1ae5cdf2_f116f547","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                    traits.append(models.Trait(name\u003dtrait_name,"},{"line_number":614,"context_line":"                                               dtype\u003dint(trait_dtype),"},{"line_number":615,"context_line":"                                               value\u003dvalue))"},{"line_number":616,"context_line":"            ts, mess \u003d event_id.split(\u0027_\u0027, 1)"},{"line_number":617,"context_line":"            events.append(models.Event("},{"line_number":618,"context_line":"                message_id\u003dmess,"},{"line_number":619,"context_line":"                event_type\u003devents_dict[\u0027event_type\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_51f24906","line":616,"updated":"2014-06-06 12:54:30.000000000","message":"please use yield here as it done in all get methods. We don\u0027t need to store all fetched events in memory","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                    traits.append(models.Trait(name\u003dtrait_name,"},{"line_number":614,"context_line":"                                               dtype\u003dint(trait_dtype),"},{"line_number":615,"context_line":"                                               value\u003dvalue))"},{"line_number":616,"context_line":"            ts, mess \u003d event_id.split(\u0027_\u0027, 1)"},{"line_number":617,"context_line":"            events.append(models.Event("},{"line_number":618,"context_line":"                message_id\u003dmess,"},{"line_number":619,"context_line":"                event_type\u003devents_dict[\u0027event_type\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_c7ef7be7","line":616,"in_reply_to":"1ae5cdf2_51f24906","updated":"2014-06-06 15:30:08.000000000","message":"Tests require to get from this method iterator not generator.","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9441eff8a3a52fbb269e1e841f48c07918ac6649","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        return events"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def get_event_types(self):"},{"line_number":627,"context_line":"        \"\"\"Return all event types as an iterable of strings."},{"line_number":628,"context_line":"        \"\"\""},{"line_number":629,"context_line":"        event_types \u003d set()"},{"line_number":630,"context_line":"        with self.conn_pool.connection() as conn:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_a76a6f17","line":627,"updated":"2014-06-06 13:34:30.000000000","message":"usually if it\u0027s one0line docstring, the closing \"\"\" is on the same line as the docstring itself","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        return events"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def get_event_types(self):"},{"line_number":627,"context_line":"        \"\"\"Return all event types as an iterable of strings."},{"line_number":628,"context_line":"        \"\"\""},{"line_number":629,"context_line":"        event_types \u003d set()"},{"line_number":630,"context_line":"        with self.conn_pool.connection() as conn:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_1ba0dba4","line":627,"in_reply_to":"1ae5cdf2_a76a6f17","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":630,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":631,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":632,"context_line":"            gen \u003d events_table.scan()"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        for event_id, data in gen:"},{"line_number":635,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":636,"context_line":"            for key, value in events_dict.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_71cca5bb","line":633,"updated":"2014-06-06 12:54:30.000000000","message":"ditto","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":630,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":631,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":632,"context_line":"            gen \u003d events_table.scan()"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        for event_id, data in gen:"},{"line_number":635,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":636,"context_line":"            for key, value in events_dict.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_47fd2b6d","line":633,"in_reply_to":"1ae5cdf2_71cca5bb","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9441eff8a3a52fbb269e1e841f48c07918ac6649","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        return event_types"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    def get_trait_types(self, event_type):"},{"line_number":642,"context_line":"        \"\"\"Return a dictionary containing the name and data type of"},{"line_number":643,"context_line":"        the trait type. Only trait types for the provided event_type are"},{"line_number":644,"context_line":"        returned."},{"line_number":645,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_077c03eb","line":642,"updated":"2014-06-06 13:34:30.000000000","message":"the same as like 793 line","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        return event_types"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    def get_trait_types(self, event_type):"},{"line_number":642,"context_line":"        \"\"\"Return a dictionary containing the name and data type of"},{"line_number":643,"context_line":"        the trait type. Only trait types for the provided event_type are"},{"line_number":644,"context_line":"        returned."},{"line_number":645,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_dbabd373","line":642,"in_reply_to":"1ae5cdf2_077c03eb","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9441eff8a3a52fbb269e1e841f48c07918ac6649","unresolved":false,"context_lines":[{"line_number":653,"context_line":"        for event_id, data in gen:"},{"line_number":654,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":655,"context_line":"            for key, value in events_dict.items():"},{"line_number":656,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":657,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":658,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":659,"context_line":"                    data_type \u003d models.Trait.type_names[int(tt_number)]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_6737874d","line":656,"updated":"2014-06-06 13:34:30.000000000","message":"It\u0027s a bad style to use \\ in this cases, just use \"if (...)\" in stead of \"if ... \\ ...\"","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":653,"context_line":"        for event_id, data in gen:"},{"line_number":654,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":655,"context_line":"            for key, value in events_dict.items():"},{"line_number":656,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":657,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":658,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":659,"context_line":"                    data_type \u003d models.Trait.type_names[int(tt_number)]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_7b02bf70","line":656,"in_reply_to":"1ae5cdf2_6737874d","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":657,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":658,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":659,"context_line":"                    data_type \u003d models.Trait.type_names[int(tt_number)]"},{"line_number":660,"context_line":"                    # traits could have same description, but different types"},{"line_number":661,"context_line":"                    if desc not in tt_dict:"},{"line_number":662,"context_line":"                        tt_dict.setdefault(desc, set([data_type]))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_2ca1e4f7","line":659,"updated":"2014-06-06 12:54:30.000000000","message":"I have a question about this. Let\u0027s consider the following structure:\n\n1234_hjkg656    f:event_type\u003dtype, f:description_1+6, f:description_1+5\n\n1235_hffddse    f:event_type:type, f:description_1+6\n\nwe need to return description_1+6 only once? \nThe comment is confusing, could you please add more details. As I understand, we need to keep a dict from description into date_types because descriptions may belong to different traits in different events with the same types. \n\nAnd one more note. You wrote (line 121) \"%s+%s\" % (trait_name, trait_type). Description and name are the same terms?","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":657,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":658,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":659,"context_line":"                    data_type \u003d models.Trait.type_names[int(tt_number)]"},{"line_number":660,"context_line":"                    # traits could have same description, but different types"},{"line_number":661,"context_line":"                    if desc not in tt_dict:"},{"line_number":662,"context_line":"                        tt_dict.setdefault(desc, set([data_type]))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_7b80ff46","line":659,"in_reply_to":"1ae5cdf2_2ca1e4f7","updated":"2014-06-06 15:30:08.000000000","message":"Answer for last note is yes: trait description and trait name is the same. I will use variable similar to one that was used in docs.\n\nMethod get_trait_types return all trait types that could be found in different events with the same event_type. But it is a question if it ever possible to have two traits with the same names and different types.","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9441eff8a3a52fbb269e1e841f48c07918ac6649","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        for event_id, data in gen:"},{"line_number":683,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":684,"context_line":"            for key, value in events_dict.items():"},{"line_number":685,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":686,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":687,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":688,"context_line":"                    traits.append(models.Trait(name\u003ddesc,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_e742b7a9","line":685,"updated":"2014-06-06 13:34:30.000000000","message":"ditto","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        for event_id, data in gen:"},{"line_number":683,"context_line":"            events_dict \u003d deserialize_entry(data)[0]"},{"line_number":684,"context_line":"            for key, value in events_dict.items():"},{"line_number":685,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":686,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":687,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":688,"context_line":"                    traits.append(models.Trait(name\u003ddesc,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_9b3dcb2f","line":685,"in_reply_to":"1ae5cdf2_e742b7a9","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":684,"context_line":"            for key, value in events_dict.items():"},{"line_number":685,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":686,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":687,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":688,"context_line":"                    traits.append(models.Trait(name\u003ddesc,"},{"line_number":689,"context_line":"                                  dtype\u003dint(tt_number), value\u003dvalue))"},{"line_number":690,"context_line":"        for trait in sorted(traits, key\u003d(lambda item: getattr(item, \u0027dtype\u0027))):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_6c5a0cf3","line":687,"updated":"2014-06-06 12:54:30.000000000","message":"Do you really need to store all fetched traits in memory? Is it critical for tests to keep Traits sorted by dtype? I guess it will slow down performance dramatically:(","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":684,"context_line":"            for key, value in events_dict.items():"},{"line_number":685,"context_line":"                if not key.startswith(\u0027event_type\u0027) and \\"},{"line_number":686,"context_line":"                        not key.startswith(\u0027timestamp\u0027):"},{"line_number":687,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":688,"context_line":"                    traits.append(models.Trait(name\u003ddesc,"},{"line_number":689,"context_line":"                                  dtype\u003dint(tt_number), value\u003dvalue))"},{"line_number":690,"context_line":"        for trait in sorted(traits, key\u003d(lambda item: getattr(item, \u0027dtype\u0027))):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_becc3563","line":687,"in_reply_to":"1ae5cdf2_6c5a0cf3","updated":"2014-06-06 15:30:08.000000000","message":"For now it is really critical for tests to keep Trait sorted. May be good decision will be to separate unit tests for different backends or to improve existing tests in way to be non-sensitive for order of getting Traits.","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9441eff8a3a52fbb269e1e841f48c07918ac6649","unresolved":false,"context_lines":[{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    @staticmethod"},{"line_number":792,"context_line":"    def ColumnPrefixFilter(args, rows):"},{"line_number":793,"context_line":"        \"\"\"This method is called from scan() when \u0027ColumnPrefixFilter\u0027"},{"line_number":794,"context_line":"        is found in the \u0027filter\u0027 argument"},{"line_number":795,"context_line":"        \"\"\""},{"line_number":796,"context_line":"        value \u003d args[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_470b6b7c","line":793,"updated":"2014-06-06 13:34:30.000000000","message":"first line of the doc string should be separated and only one. Like:\n\n\"\"\" This is small description.\n\nThis is additional info.\n\"\"\"","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    @staticmethod"},{"line_number":792,"context_line":"    def ColumnPrefixFilter(args, rows):"},{"line_number":793,"context_line":"        \"\"\"This method is called from scan() when \u0027ColumnPrefixFilter\u0027"},{"line_number":794,"context_line":"        is found in the \u0027filter\u0027 argument"},{"line_number":795,"context_line":"        \"\"\""},{"line_number":796,"context_line":"        value \u003d args[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_fb8ecfcf","line":793,"in_reply_to":"1ae5cdf2_470b6b7c","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9441eff8a3a52fbb269e1e841f48c07918ac6649","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"    @staticmethod"},{"line_number":808,"context_line":"    def RowFilter(args, rows):"},{"line_number":809,"context_line":"        \"\"\"This method is called from scan() when \u0027RowFilter\u0027"},{"line_number":810,"context_line":"        is found in the \u0027filter\u0027 argument"},{"line_number":811,"context_line":"        \"\"\""},{"line_number":812,"context_line":"        op \u003d args[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_670ea78d","line":809,"updated":"2014-06-06 13:34:30.000000000","message":"the same","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"    @staticmethod"},{"line_number":808,"context_line":"    def RowFilter(args, rows):"},{"line_number":809,"context_line":"        \"\"\"This method is called from scan() when \u0027RowFilter\u0027"},{"line_number":810,"context_line":"        is found in the \u0027filter\u0027 argument"},{"line_number":811,"context_line":"        \"\"\""},{"line_number":812,"context_line":"        op \u003d args[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_3bc037e0","line":809,"in_reply_to":"1ae5cdf2_670ea78d","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":816,"context_line":"        r \u003d {}"},{"line_number":817,"context_line":"        for row, data in rows.items():"},{"line_number":818,"context_line":"            try:"},{"line_number":819,"context_line":"                g \u003d re.search(value, row).group(0)"},{"line_number":820,"context_line":"                if g:"},{"line_number":821,"context_line":"                    if op \u003d\u003d \u0027\u003d\u0027:"},{"line_number":822,"context_line":"                        if g \u003d\u003d row:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_8cd03820","line":819,"updated":"2014-06-06 12:54:30.000000000","message":"Please do smth with it :)","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":816,"context_line":"        r \u003d {}"},{"line_number":817,"context_line":"        for row, data in rows.items():"},{"line_number":818,"context_line":"            try:"},{"line_number":819,"context_line":"                g \u003d re.search(value, row).group(0)"},{"line_number":820,"context_line":"                if g:"},{"line_number":821,"context_line":"                    if op \u003d\u003d \u0027\u003d\u0027:"},{"line_number":822,"context_line":"                        if g \u003d\u003d row:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_1b49bb8e","line":819,"in_reply_to":"1ae5cdf2_8cd03820","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":884,"context_line":"    ts \u003d td.microseconds + td.seconds * 1000000 + td.days * 86400000000"},{"line_number":885,"context_line":"    return 0x7fffffffffffffff - ts"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"def timestamp(dt):"},{"line_number":889,"context_line":"    \"\"\"Timestamp represents newer events with bigger numbers than older ones."},{"line_number":890,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_560b1f7c","line":887,"updated":"2014-06-06 12:54:30.000000000","message":"Please use your new method inside reverse_timestsmp. And comment should be fixed: it is not only about events. \"Convert datetime object to timestamp in milliseconds\" - smth like this","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":884,"context_line":"    ts \u003d td.microseconds + td.seconds * 1000000 + td.days * 86400000000"},{"line_number":885,"context_line":"    return 0x7fffffffffffffff - ts"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"def timestamp(dt):"},{"line_number":889,"context_line":"    \"\"\"Timestamp represents newer events with bigger numbers than older ones."},{"line_number":890,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_bb20c7b1","line":887,"in_reply_to":"1ae5cdf2_560b1f7c","updated":"2014-06-06 15:30:08.000000000","message":"Done","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0782c08a435bed501b424b6448f9a96708073dcb","unresolved":false,"context_lines":[{"line_number":983,"context_line":"    \"\"\""},{"line_number":984,"context_line":"    q \u003d []"},{"line_number":985,"context_line":"    res_q \u003d None"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"    # Query for traits if a little differ from others it is constructed with"},{"line_number":988,"context_line":"    # SingleColumnValueFilter with the possibility to choose an operator for"},{"line_number":989,"context_line":"    # value"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_ccc24033","line":986,"updated":"2014-06-06 12:54:30.000000000","message":"Not clear to me, did you mean that in trait_query we may vary operator for value?","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"2363a407da0ce519b6c73cf572c77527f73af958","unresolved":false,"context_lines":[{"line_number":983,"context_line":"    \"\"\""},{"line_number":984,"context_line":"    q \u003d []"},{"line_number":985,"context_line":"    res_q \u003d None"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"    # Query for traits if a little differ from others it is constructed with"},{"line_number":988,"context_line":"    # SingleColumnValueFilter with the possibility to choose an operator for"},{"line_number":989,"context_line":"    # value"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_1edc4918","line":986,"in_reply_to":"1ae5cdf2_ccc24033","updated":"2014-06-06 15:30:08.000000000","message":"Yes, you are right. If you look at storage.EventFilter, you will find that one of the optional parameters for trait_filter is \u0027op\u0027 (operator) for trait value.","commit_id":"3fe1c70a587a69b112140145cf4e39b9526a8d6e"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    - events"},{"line_number":114,"context_line":"      - row_key: timestamp of event\u0027s generation + uuid of event"},{"line_number":115,"context_line":"                 in format: \"%s+%s\" % (ts, Event.message_id)"},{"line_number":116,"context_line":"      -Column Families:"},{"line_number":117,"context_line":"          f: contains the following qualifiers:"},{"line_number":118,"context_line":"              -event_type: description of event\u0027s type"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_1ef8a0c3","line":115,"updated":"2014-06-09 09:45:15.000000000","message":"So I\u0027m wondering why the timestamp is needed here.\n\nSurely a randomly generated event UUID is effectively unique in practical terms (i.e. the likelihood of a collision is very low).\n\nOr is the intent of adding the timestamp to the key to provide some kind of ordering optimization on the storage side?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    - events"},{"line_number":114,"context_line":"      - row_key: timestamp of event\u0027s generation + uuid of event"},{"line_number":115,"context_line":"                 in format: \"%s+%s\" % (ts, Event.message_id)"},{"line_number":116,"context_line":"      -Column Families:"},{"line_number":117,"context_line":"          f: contains the following qualifiers:"},{"line_number":118,"context_line":"              -event_type: description of event\u0027s type"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_e1b35908","line":115,"in_reply_to":"1ae5cdf2_1ef8a0c3","updated":"2014-06-09 10:15:53.000000000","message":"That was discussed in the \"[openstack-dev] [Ceilometer] Question of necessary queries for Event implemented on HBase\" ML thread, but the main idea is to enable time-based sort.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":118,"context_line":"              -event_type: description of event\u0027s type"},{"line_number":119,"context_line":"              -timestamp: time stamp of event generation"},{"line_number":120,"context_line":"              -all traits for this event in format"},{"line_number":121,"context_line":"               \"%s+%s\" % (trait_name, trait_type)"},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    CAPABILITIES \u003d utils.update_nested(base.Connection.CAPABILITIES,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_5e194821","line":121,"updated":"2014-06-09 09:45:15.000000000","message":"Is that a literal \u0027+\u0027?\n\nAre literal plus signs explicitly disallowed in trait names?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"38841c6766ab2149dba6ff7d4d61490e133bd098","unresolved":false,"context_lines":[{"line_number":118,"context_line":"              -event_type: description of event\u0027s type"},{"line_number":119,"context_line":"              -timestamp: time stamp of event generation"},{"line_number":120,"context_line":"              -all traits for this event in format"},{"line_number":121,"context_line":"               \"%s+%s\" % (trait_name, trait_type)"},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    CAPABILITIES \u003d utils.update_nested(base.Connection.CAPABILITIES,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_179b1eca","line":121,"in_reply_to":"1ae5cdf2_5e194821","updated":"2014-06-09 13:27:50.000000000","message":"Good question. I didn\u0027t pay enough attention to this separator. It\u0027s really not disallowed and will bring a lot of pain if \u0027+\u0027 is used as part of trait name. But there is one more separator in HBase impl: \"_\". Maybe we will create another cr that will clear up this stuff? Just create a \u0027separator_variable\u0027 and use it everywhere. I\u0027m afraid that this change will cause even more changed lines and this patch will be too difficult to be reviewed. What do you think?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            conn.create_table(self.METER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":158,"context_line":"            conn.create_table(self.ALARM_TABLE, {\u0027f\u0027: dict()})"},{"line_number":159,"context_line":"            conn.create_table(self.ALARM_HISTORY_TABLE, {\u0027f\u0027: dict()})"},{"line_number":160,"context_line":"            conn.create_table(self.EVENTS_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def clear(self):"},{"line_number":163,"context_line":"        LOG.debug(_(\u0027Dropping HBase schema...\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_3e91dc52","line":160,"updated":"2014-06-09 09:45:15.000000000","message":"Not directly related to this patch, but I wonder why max_versions\u003d1 is set for all tables except the alarm tables?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c0799e4269e00b59da435277e9ad3d98d1add8be","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            conn.create_table(self.METER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":158,"context_line":"            conn.create_table(self.ALARM_TABLE, {\u0027f\u0027: dict()})"},{"line_number":159,"context_line":"            conn.create_table(self.ALARM_HISTORY_TABLE, {\u0027f\u0027: dict()})"},{"line_number":160,"context_line":"            conn.create_table(self.EVENTS_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def clear(self):"},{"line_number":163,"context_line":"        LOG.debug(_(\u0027Dropping HBase schema...\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_bcd25432","line":160,"in_reply_to":"1ae5cdf2_01eda58b","updated":"2014-06-09 10:43:15.000000000","message":"Nadya said in that patch, what Dina mentioned, that the Alarm part will be fixed separatley, that is why those tables are not modified here.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            conn.create_table(self.METER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":158,"context_line":"            conn.create_table(self.ALARM_TABLE, {\u0027f\u0027: dict()})"},{"line_number":159,"context_line":"            conn.create_table(self.ALARM_HISTORY_TABLE, {\u0027f\u0027: dict()})"},{"line_number":160,"context_line":"            conn.create_table(self.EVENTS_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def clear(self):"},{"line_number":163,"context_line":"        LOG.debug(_(\u0027Dropping HBase schema...\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_01eda58b","line":160,"in_reply_to":"1ae5cdf2_3e91dc52","updated":"2014-06-09 10:15:53.000000000","message":"that\u0027s because in first two it\u0027s used to allow resources to store list of metrics (it was changed in Nadya\u0027s change). Here it\u0027s used","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"90b588e11a995626521aa2989d7cf1f27ed0f014","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            conn.create_table(self.METER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":158,"context_line":"            conn.create_table(self.ALARM_TABLE, {\u0027f\u0027: dict()})"},{"line_number":159,"context_line":"            conn.create_table(self.ALARM_HISTORY_TABLE, {\u0027f\u0027: dict()})"},{"line_number":160,"context_line":"            conn.create_table(self.EVENTS_TABLE, {\u0027f\u0027: dict(max_versions\u003d1)})"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def clear(self):"},{"line_number":163,"context_line":"        LOG.debug(_(\u0027Dropping HBase schema...\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_747380b1","line":160,"in_reply_to":"1ae5cdf2_bcd25432","updated":"2014-06-09 13:13:48.000000000","message":"Yep, right. Just to avoid alarm-related changes in this patch. By default max_versions\u003d3.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":572,"context_line":"                # models.Event or purposes of storage event sorted by"},{"line_number":573,"context_line":"                # timestamp in the database."},{"line_number":574,"context_line":"                ts \u003d event_model.generated"},{"line_number":575,"context_line":"                row \u003d \"%d_%s\" % (reverse_timestamp(ts, reverse\u003dFalse),"},{"line_number":576,"context_line":"                                 event_model.message_id)"},{"line_number":577,"context_line":"                event_type \u003d event_model.event_type"},{"line_number":578,"context_line":"                traits \u003d {}"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_beba4cbe","line":575,"updated":"2014-06-09 09:45:15.000000000","message":"The use of *reverse*_timestamp with reverse\u003dFalse seem logically inconsistent.\n\nWould it be more readable just to have a separate method that returned the  reverse\u003dFalse style value?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":572,"context_line":"                # models.Event or purposes of storage event sorted by"},{"line_number":573,"context_line":"                # timestamp in the database."},{"line_number":574,"context_line":"                ts \u003d event_model.generated"},{"line_number":575,"context_line":"                row \u003d \"%d_%s\" % (reverse_timestamp(ts, reverse\u003dFalse),"},{"line_number":576,"context_line":"                                 event_model.message_id)"},{"line_number":577,"context_line":"                event_type \u003d event_model.event_type"},{"line_number":578,"context_line":"                traits \u003d {}"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_e134394c","line":575,"in_reply_to":"1ae5cdf2_beba4cbe","updated":"2014-06-09 10:15:53.000000000","message":"I guess it\u0027ll be better here, yes","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"90b588e11a995626521aa2989d7cf1f27ed0f014","unresolved":false,"context_lines":[{"line_number":572,"context_line":"                # models.Event or purposes of storage event sorted by"},{"line_number":573,"context_line":"                # timestamp in the database."},{"line_number":574,"context_line":"                ts \u003d event_model.generated"},{"line_number":575,"context_line":"                row \u003d \"%d_%s\" % (reverse_timestamp(ts, reverse\u003dFalse),"},{"line_number":576,"context_line":"                                 event_model.message_id)"},{"line_number":577,"context_line":"                event_type \u003d event_model.event_type"},{"line_number":578,"context_line":"                traits \u003d {}"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_340ad8d2","line":575,"in_reply_to":"1ae5cdf2_beba4cbe","updated":"2014-06-09 13:13:48.000000000","message":"I\u0027ve suggested to rename reverse_timestamp to just timestamp. Is it ok, Eoghan?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"652efd3db1fa052d26bd0fa26f2846bf640e7e94","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    for trait in event_model.traits:"},{"line_number":581,"context_line":"                        key \u003d \"%s+%d\" % (trait.name, trait.dtype)"},{"line_number":582,"context_line":"                        traits[key] \u003d trait.value"},{"line_number":583,"context_line":"                record \u003d serialize_entry(traits, **{\u0027event_type\u0027: event_type,"},{"line_number":584,"context_line":"                                                    \u0027timestamp\u0027: ts})"},{"line_number":585,"context_line":"                try:"},{"line_number":586,"context_line":"                    events_table.put(row, record)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_7c1c4c6b","line":583,"updated":"2014-06-09 11:10:12.000000000","message":"Maybe it would be more clearer if you use event_type\u003devent_type?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":588,"context_line":"                    LOG.debug(_(\"Failed to record event: %s\") % ex)"},{"line_number":589,"context_line":"                    problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":590,"context_line":"                                           event_model))"},{"line_number":591,"context_line":"        return problem_events"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"    def get_events(self, event_filter):"},{"line_number":594,"context_line":"        \"\"\"Return an iterable of models.Event objects."}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_7e736415","line":591,"updated":"2014-06-09 09:45:15.000000000","message":"Not directly related to your patch, but I\u0027m wondering about returning all events that couldn\u0027t be stored in this way.\n\nWouldn\u0027t that cause the notifications to be simply requeued, hence come back around to the storage driver and possibly fail for the same reason?\n\nDoes it make sense to try to distinguish between the \"permanent\" and \"transient\" failure cases (no point in retrying the former case).","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":588,"context_line":"                    LOG.debug(_(\"Failed to record event: %s\") % ex)"},{"line_number":589,"context_line":"                    problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":590,"context_line":"                                           event_model))"},{"line_number":591,"context_line":"        return problem_events"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"    def get_events(self, event_filter):"},{"line_number":594,"context_line":"        \"\"\"Return an iterable of models.Event objects."}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_216c6136","line":591,"in_reply_to":"1ae5cdf2_7e736415","updated":"2014-06-09 10:15:53.000000000","message":"It was done here having SQL-based impl as a inspiration :) I guess we may discuss this separately :)","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def get_event_types(self):"},{"line_number":627,"context_line":"        \"\"\"Return all event types as an iterable of strings.\"\"\""},{"line_number":628,"context_line":"        event_types \u003d set()"},{"line_number":629,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":630,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":631,"context_line":"            gen \u003d events_table.scan()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_7ef8c449","line":628,"updated":"2014-06-09 09:45:15.000000000","message":"The purpose of the event_types set would be clearer if it was moved down to line 632","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def get_event_types(self):"},{"line_number":627,"context_line":"        \"\"\"Return all event types as an iterable of strings.\"\"\""},{"line_number":628,"context_line":"        event_types \u003d set()"},{"line_number":629,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":630,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":631,"context_line":"            gen \u003d events_table.scan()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_61766908","line":628,"in_reply_to":"1ae5cdf2_7ef8c449","updated":"2014-06-09 10:15:53.000000000","message":"ok, will be done","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        :param event_type: the type of the Event"},{"line_number":646,"context_line":"        \"\"\""},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type})"},{"line_number":649,"context_line":"        ttypes \u003d set()"},{"line_number":650,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":651,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_dee718ab","line":648,"updated":"2014-06-09 09:45:15.000000000","message":"Would that be clearer as:\n\n    q \u003d make_query(event_type\u003devent_type)","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        :param event_type: the type of the Event"},{"line_number":646,"context_line":"        \"\"\""},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type})"},{"line_number":649,"context_line":"        ttypes \u003d set()"},{"line_number":650,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":651,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_a15f9174","line":648,"in_reply_to":"1ae5cdf2_dee718ab","updated":"2014-06-09 10:15:53.000000000","message":"yes, it will :) thanks!","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":646,"context_line":"        \"\"\""},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type})"},{"line_number":649,"context_line":"        ttypes \u003d set()"},{"line_number":650,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":651,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":652,"context_line":"            gen \u003d events_table.scan(filter\u003dq)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_de9e3807","line":649,"updated":"2014-06-09 09:45:15.000000000","message":"s/ttypes/trait_types/","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":646,"context_line":"        \"\"\""},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type})"},{"line_number":649,"context_line":"        ttypes \u003d set()"},{"line_number":650,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":651,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"},{"line_number":652,"context_line":"            gen \u003d events_table.scan(filter\u003dq)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_c1649d4b","line":649,"in_reply_to":"1ae5cdf2_de9e3807","updated":"2014-06-09 10:15:53.000000000","message":"ok, will be done","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        :param event_type: the type of the Event to filter by"},{"line_number":669,"context_line":"        :param trait_type: the name of the Trait to filter by"},{"line_number":670,"context_line":"        \"\"\""},{"line_number":671,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type, \u0027trait_type\u0027: trait_type})"},{"line_number":672,"context_line":"        traits \u003d []"},{"line_number":673,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":674,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_7e8fe4cc","line":671,"updated":"2014-06-09 09:45:15.000000000","message":"Would that be clearer as:\n\n    q \u003d make_query(event_type\u003devent_type, trait_type\u003dtrait_type)","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        :param event_type: the type of the Event to filter by"},{"line_number":669,"context_line":"        :param trait_type: the name of the Trait to filter by"},{"line_number":670,"context_line":"        \"\"\""},{"line_number":671,"context_line":"        q \u003d make_query(**{\u0027event_type\u0027: event_type, \u0027trait_type\u0027: trait_type})"},{"line_number":672,"context_line":"        traits \u003d []"},{"line_number":673,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":674,"context_line":"            events_table \u003d conn.table(self.EVENTS_TABLE)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_614d89c4","line":671,"in_reply_to":"1ae5cdf2_7e8fe4cc","updated":"2014-06-09 10:15:53.000000000","message":"ok","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":681,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":682,"context_line":"                    traits.append(models.Trait(name\u003ddesc,"},{"line_number":683,"context_line":"                                  dtype\u003dint(tt_number), value\u003dvalue))"},{"line_number":684,"context_line":"        for trait in sorted(traits, key\u003d(lambda item: getattr(item, \u0027dtype\u0027))):"},{"line_number":685,"context_line":"            yield trait"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_be67ac24","line":684,"updated":"2014-06-09 09:45:15.000000000","message":"Is that lambda equivalent to:\n\n  operator.attrgetter(\u0027dtype\u0027)","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":681,"context_line":"                    desc, tt_number \u003d key.split(\u0027+\u0027)"},{"line_number":682,"context_line":"                    traits.append(models.Trait(name\u003ddesc,"},{"line_number":683,"context_line":"                                  dtype\u003dint(tt_number), value\u003dvalue))"},{"line_number":684,"context_line":"        for trait in sorted(traits, key\u003d(lambda item: getattr(item, \u0027dtype\u0027))):"},{"line_number":685,"context_line":"            yield trait"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_01d685c5","line":684,"in_reply_to":"1ae5cdf2_be67ac24","updated":"2014-06-09 10:15:53.000000000","message":"I guess it is, yes","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c0799e4269e00b59da435277e9ad3d98d1add8be","unresolved":false,"context_lines":[{"line_number":787,"context_line":"        \"\"\"This is filter for testing \"in-memory HBase\"."},{"line_number":788,"context_line":""},{"line_number":789,"context_line":"        This method is called from scan() when \u0027ColumnPrefixFilter\u0027 is found"},{"line_number":790,"context_line":"        in the \u0027filter\u0027 argument"},{"line_number":791,"context_line":"        \"\"\""},{"line_number":792,"context_line":"        value \u003d args[0]"},{"line_number":793,"context_line":"        column \u003d \u0027f:\u0027 + value"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_fcfdbc6f","line":790,"updated":"2014-06-09 10:43:15.000000000","message":"It would be nice to add param list to the docstring.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c0799e4269e00b59da435277e9ad3d98d1add8be","unresolved":false,"context_lines":[{"line_number":805,"context_line":"        \"\"\"This is filter for testing \"in-memory HBase\"."},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        This method is called from scan() when \u0027RowFilter\u0027"},{"line_number":808,"context_line":"        is found in the \u0027filter\u0027 argument"},{"line_number":809,"context_line":"        \"\"\""},{"line_number":810,"context_line":"        op \u003d args[0]"},{"line_number":811,"context_line":"        value \u003d args[1]"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_1c034874","line":808,"updated":"2014-06-09 10:43:15.000000000","message":"Same as above.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"90b588e11a995626521aa2989d7cf1f27ed0f014","unresolved":false,"context_lines":[{"line_number":866,"context_line":""},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"#################################################"},{"line_number":869,"context_line":"# Here be various HBase helpers"},{"line_number":870,"context_line":"def reverse_timestamp(dt, reverse\u003dTrue):"},{"line_number":871,"context_line":"    \"\"\"Reverse timestamp so that newer timestamps are represented by smaller"},{"line_number":872,"context_line":"    numbers than older ones."}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_b4c0a87d","line":869,"updated":"2014-06-09 13:13:48.000000000","message":"it\u0027s better to change the name to \u0027timestamp\u0027","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"90b588e11a995626521aa2989d7cf1f27ed0f014","unresolved":false,"context_lines":[{"line_number":867,"context_line":""},{"line_number":868,"context_line":"#################################################"},{"line_number":869,"context_line":"# Here be various HBase helpers"},{"line_number":870,"context_line":"def reverse_timestamp(dt, reverse\u003dTrue):"},{"line_number":871,"context_line":"    \"\"\"Reverse timestamp so that newer timestamps are represented by smaller"},{"line_number":872,"context_line":"    numbers than older ones."},{"line_number":873,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_1405dcc1","line":870,"updated":"2014-06-09 13:13:48.000000000","message":"Please fix doctoring because it may be not reversed","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c0799e4269e00b59da435277e9ad3d98d1add8be","unresolved":false,"context_lines":[{"line_number":874,"context_line":"    Reverse timestamps is a technique used in HBase rowkey design. When period"},{"line_number":875,"context_line":"    queries are required the HBase rowkeys must include timestamps, but as"},{"line_number":876,"context_line":"    rowkeys in HBase are ordered lexicographically, the timestamps must be"},{"line_number":877,"context_line":"    reversed."},{"line_number":878,"context_line":"    param: reverse: set this param equal to False if you need to use timestamp"},{"line_number":879,"context_line":"    instead of reverse_timestamp"},{"line_number":880,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_dc2f20f5","line":877,"updated":"2014-06-09 10:43:15.000000000","message":"The description for \u0027dt\u0027 is missing.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c0799e4269e00b59da435277e9ad3d98d1add8be","unresolved":false,"context_lines":[{"line_number":875,"context_line":"    queries are required the HBase rowkeys must include timestamps, but as"},{"line_number":876,"context_line":"    rowkeys in HBase are ordered lexicographically, the timestamps must be"},{"line_number":877,"context_line":"    reversed."},{"line_number":878,"context_line":"    param: reverse: set this param equal to False if you need to use timestamp"},{"line_number":879,"context_line":"    instead of reverse_timestamp"},{"line_number":880,"context_line":"    \"\"\""},{"line_number":881,"context_line":"    epoch \u003d datetime.datetime(1970, 1, 1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_fc34dc4b","line":878,"updated":"2014-06-09 10:43:15.000000000","message":"s/param:/:param/","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":985,"context_line":"        dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3,"},{"line_number":986,"context_line":"                       \u0027datetime\u0027: 4}"},{"line_number":987,"context_line":"        op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"},{"line_number":988,"context_line":"                   \u0027ge\u0027: \u0027\u003e\u003d\u0027}"},{"line_number":989,"context_line":"        trait_name \u003d kwargs.pop(\u0027key\u0027)"},{"line_number":990,"context_line":"        op \u003d kwargs.pop(\u0027op\u0027, \u0027eq\u0027)"},{"line_number":991,"context_line":"        for k, v in kwargs.items():"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_5e578826","line":988,"updated":"2014-06-09 09:45:15.000000000","message":"Move dtype_names and op_sign outside the method to top-level constants?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"325ebac92c92af3c2b4dcbda515b32c2e35ce834","unresolved":false,"context_lines":[{"line_number":985,"context_line":"        dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3,"},{"line_number":986,"context_line":"                       \u0027datetime\u0027: 4}"},{"line_number":987,"context_line":"        op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"},{"line_number":988,"context_line":"                   \u0027ge\u0027: \u0027\u003e\u003d\u0027}"},{"line_number":989,"context_line":"        trait_name \u003d kwargs.pop(\u0027key\u0027)"},{"line_number":990,"context_line":"        op \u003d kwargs.pop(\u0027op\u0027, \u0027eq\u0027)"},{"line_number":991,"context_line":"        for k, v in kwargs.items():"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_c1f2dd6e","line":988,"in_reply_to":"1ae5cdf2_5e578826","updated":"2014-06-09 10:15:53.000000000","message":"ok, quite logical :)","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"9bfabf8666006166a81e1d2cccf4746f1f905310","unresolved":false,"context_lines":[{"line_number":41,"context_line":"from ceilometer import utils"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"AVAILABLE_CAPABILITIES \u003d {"},{"line_number":47,"context_line":"    \u0027meters\u0027: {\u0027query\u0027: {\u0027simple\u0027: True,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_da4abb54","line":44,"updated":"2014-06-09 14:04:34.000000000","message":"btw, should we add \u0027event\u0027 capability?","commit_id":"4f56af6231d310f4ee14b09369440271fbd0afa8"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7c9b4cb3dc5e02481af82ccb2ca4afb3afacfeb2","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \u0027storage\u0027: {\u0027production_ready\u0027: True},"},{"line_number":62,"context_line":"}"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3,"},{"line_number":65,"context_line":"               \u0027datetime\u0027: 4}"},{"line_number":66,"context_line":"op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"},{"line_number":67,"context_line":"           \u0027ge\u0027: \u0027\u003e\u003d\u0027}"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_459fb003","line":64,"updated":"2014-06-09 15:13:09.000000000","message":"For consistency, please capitalize dtype_names, e.g.:\n\n  DATA_TYPE_NAMES \u003d {\u0027none\u0027: 0, ...}","commit_id":"6edc32a380b21346df153196645e6d0c43ca5d4c"},{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"f643df0e1068e42a3dc0e616024b84111bf052f3","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \u0027storage\u0027: {\u0027production_ready\u0027: True},"},{"line_number":62,"context_line":"}"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3,"},{"line_number":65,"context_line":"               \u0027datetime\u0027: 4}"},{"line_number":66,"context_line":"op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"},{"line_number":67,"context_line":"           \u0027ge\u0027: \u0027\u003e\u003d\u0027}"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_ab912354","line":64,"in_reply_to":"1ae5cdf2_459fb003","updated":"2014-06-09 16:05:52.000000000","message":"Done","commit_id":"6edc32a380b21346df153196645e6d0c43ca5d4c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7c9b4cb3dc5e02481af82ccb2ca4afb3afacfeb2","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3,"},{"line_number":65,"context_line":"               \u0027datetime\u0027: 4}"},{"line_number":66,"context_line":"op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"},{"line_number":67,"context_line":"           \u0027ge\u0027: \u0027\u003e\u003d\u0027}"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_a5acf436","line":66,"updated":"2014-06-09 15:13:09.000000000","message":"Similarly s/op_sign/OPERATOR_SIGN/","commit_id":"6edc32a380b21346df153196645e6d0c43ca5d4c"},{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"f643df0e1068e42a3dc0e616024b84111bf052f3","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"dtype_names \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3,"},{"line_number":65,"context_line":"               \u0027datetime\u0027: 4}"},{"line_number":66,"context_line":"op_sign \u003d {\u0027eq\u0027: \u0027\u003d\u0027, \u0027lt\u0027: \u0027\u003c\u0027, \u0027le\u0027: \u0027\u003c\u003d\u0027, \u0027ne\u0027: \u0027!\u003d\u0027, \u0027gt\u0027: \u0027\u003e\u0027,"},{"line_number":67,"context_line":"           \u0027ge\u0027: \u0027\u003e\u003d\u0027}"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_eb9b2b70","line":66,"in_reply_to":"1ae5cdf2_a5acf436","updated":"2014-06-09 16:05:52.000000000","message":"Done","commit_id":"6edc32a380b21346df153196645e6d0c43ca5d4c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d2b756787922cc012ec6bc9ce2ba5e0612798d8d","unresolved":false,"context_lines":[{"line_number":581,"context_line":"    def record_events(self, event_models):"},{"line_number":582,"context_line":"        \"\"\"Write the events to Hbase."},{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        :param event_models: a list of models.Event objects."},{"line_number":585,"context_line":"        \"\"\""},{"line_number":586,"context_line":"        problem_events \u003d []"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_69a2be9b","line":584,"updated":"2014-06-09 18:26:17.000000000","message":"It would be nice to have the description of the returned \u0027problem_events\u0027 here.","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"05eb2087790108dd0c0c30f1e04b660d3f331a04","unresolved":false,"context_lines":[{"line_number":581,"context_line":"    def record_events(self, event_models):"},{"line_number":582,"context_line":"        \"\"\"Write the events to Hbase."},{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        :param event_models: a list of models.Event objects."},{"line_number":585,"context_line":"        \"\"\""},{"line_number":586,"context_line":"        problem_events \u003d []"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_ae01153b","line":584,"in_reply_to":"1ae5cdf2_69a2be9b","updated":"2014-06-10 06:58:42.000000000","message":"Mehdi has raised this question in patch set 8, please take a look. \"Problem events\" is get from sql implementation as far as I understand","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d2b756787922cc012ec6bc9ce2ba5e0612798d8d","unresolved":false,"context_lines":[{"line_number":616,"context_line":"        :param event_filter: storage.EventFilter object, consists of filters"},{"line_number":617,"context_line":"                             for events that are stored in database."},{"line_number":618,"context_line":"        \"\"\""},{"line_number":619,"context_line":"        q, start, stop \u003d make_events_query_from_filter(event_filter)"},{"line_number":620,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":621,"context_line":"            events_table \u003d conn.table(self.EVENT_TABLE)"},{"line_number":622,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_4eb508cc","line":619,"updated":"2014-06-09 18:26:17.000000000","message":"It would be nice in the future to avoid one character long variable names, like \u0027q\u0027 here.","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d2b756787922cc012ec6bc9ce2ba5e0612798d8d","unresolved":false,"context_lines":[{"line_number":620,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":621,"context_line":"            events_table \u003d conn.table(self.EVENT_TABLE)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"            gen \u003d events_table.scan(filter\u003dq, row_start\u003dstart, row_stop\u003dstop)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        events \u003d []"},{"line_number":626,"context_line":"        for event_id, data in gen:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_2eb0bcdc","line":623,"updated":"2014-06-09 18:26:17.000000000","message":"It would be nice to use more readable/meaningful variable names.","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"05eb2087790108dd0c0c30f1e04b660d3f331a04","unresolved":false,"context_lines":[{"line_number":620,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":621,"context_line":"            events_table \u003d conn.table(self.EVENT_TABLE)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"            gen \u003d events_table.scan(filter\u003dq, row_start\u003dstart, row_stop\u003dstop)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        events \u003d []"},{"line_number":626,"context_line":"        for event_id, data in gen:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_8ea29949","line":623,"in_reply_to":"1ae5cdf2_2eb0bcdc","updated":"2014-06-10 06:58:42.000000000","message":"\"gen\" is generator here. It\u0027s actually senseless:) We will just iterate through this below","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d2b756787922cc012ec6bc9ce2ba5e0612798d8d","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            for key, value in events_dict.items():"},{"line_number":677,"context_line":"                if (not key.startswith(\u0027event_type\u0027) and"},{"line_number":678,"context_line":"                        not key.startswith(\u0027timestamp\u0027)):"},{"line_number":679,"context_line":"                    desc, tt_number \u003d key.rsplit(\u0027+\u0027, 1)"},{"line_number":680,"context_line":"                    if desc not in trait_types:"},{"line_number":681,"context_line":"                        trait_types.add(desc)"},{"line_number":682,"context_line":"                        data_type \u003d models.Trait.type_names[int(tt_number)]"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_89362ae6","line":679,"updated":"2014-06-09 18:26:17.000000000","message":"Is \u0027desc\u0027 the name of the trait here, right?","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"05eb2087790108dd0c0c30f1e04b660d3f331a04","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            for key, value in events_dict.items():"},{"line_number":677,"context_line":"                if (not key.startswith(\u0027event_type\u0027) and"},{"line_number":678,"context_line":"                        not key.startswith(\u0027timestamp\u0027)):"},{"line_number":679,"context_line":"                    desc, tt_number \u003d key.rsplit(\u0027+\u0027, 1)"},{"line_number":680,"context_line":"                    if desc not in trait_types:"},{"line_number":681,"context_line":"                        trait_types.add(desc)"},{"line_number":682,"context_line":"                        data_type \u003d models.Trait.type_names[int(tt_number)]"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_4e66d12a","line":679,"in_reply_to":"1ae5cdf2_89362ae6","updated":"2014-06-10 06:58:42.000000000","message":"As I understand, yes. desc (description) and \u0027name\u0027 are the same. This question was raised in some patch but lost during discussions","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d2b756787922cc012ec6bc9ce2ba5e0612798d8d","unresolved":false,"context_lines":[{"line_number":677,"context_line":"                if (not key.startswith(\u0027event_type\u0027) and"},{"line_number":678,"context_line":"                        not key.startswith(\u0027timestamp\u0027)):"},{"line_number":679,"context_line":"                    desc, tt_number \u003d key.rsplit(\u0027+\u0027, 1)"},{"line_number":680,"context_line":"                    if desc not in trait_types:"},{"line_number":681,"context_line":"                        trait_types.add(desc)"},{"line_number":682,"context_line":"                        data_type \u003d models.Trait.type_names[int(tt_number)]"},{"line_number":683,"context_line":"                        yield {\u0027name\u0027: desc, \u0027data_type\u0027: data_type}"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_e9cfaeb1","line":680,"updated":"2014-06-09 18:26:17.000000000","message":"This adding \u0027desc\u0027 to trait_types is just a naming issue here, right?","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d2b756787922cc012ec6bc9ce2ba5e0612798d8d","unresolved":false,"context_lines":[{"line_number":699,"context_line":"            for key, value in events_dict.items():"},{"line_number":700,"context_line":"                if (not key.startswith(\u0027event_type\u0027) and"},{"line_number":701,"context_line":"                        not key.startswith(\u0027timestamp\u0027)):"},{"line_number":702,"context_line":"                    desc, tt_number \u003d key.rsplit(\u0027+\u0027, 1)"},{"line_number":703,"context_line":"                    traits.append(models.Trait(name\u003ddesc,"},{"line_number":704,"context_line":"                                  dtype\u003dint(tt_number), value\u003dvalue))"},{"line_number":705,"context_line":"        for trait in sorted(traits, key\u003doperator.attrgetter(\u0027dtype\u0027)):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_49b0a2f4","line":702,"updated":"2014-06-09 18:26:17.000000000","message":"Same question as above.","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d2b756787922cc012ec6bc9ce2ba5e0612798d8d","unresolved":false,"context_lines":[{"line_number":902,"context_line":""},{"line_number":903,"context_line":"    Same for the reversed timestamps, but the order will be opposite."},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    :param: dt datetime which is translated to the (reversed or not) timestamp"},{"line_number":906,"context_line":"    :return count or reversed count of milliseconds since start of epoch"},{"line_number":907,"context_line":"    \"\"\""},{"line_number":908,"context_line":"    epoch \u003d datetime.datetime(1970, 1, 1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_3341050c","line":905,"updated":"2014-06-09 18:26:17.000000000","message":"It would be nice to have both parameters described in the param list here.","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"05eb2087790108dd0c0c30f1e04b660d3f331a04","unresolved":false,"context_lines":[{"line_number":902,"context_line":""},{"line_number":903,"context_line":"    Same for the reversed timestamps, but the order will be opposite."},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    :param: dt datetime which is translated to the (reversed or not) timestamp"},{"line_number":906,"context_line":"    :return count or reversed count of milliseconds since start of epoch"},{"line_number":907,"context_line":"    \"\"\""},{"line_number":908,"context_line":"    epoch \u003d datetime.datetime(1970, 1, 1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_4e4df198","line":905,"in_reply_to":"1ae5cdf2_3341050c","updated":"2014-06-10 06:58:42.000000000","message":"yep, agreed","commit_id":"fd331e35afcf35a8e8c36acbcd610aa084d0d0f1"}],"ceilometer/tests/storage/test_storage_scenarios.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"a1802394e3a159d8e7a3bc3f215e811ef685dbd6","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_de40f809","line":2721,"updated":"2014-06-09 09:45:15.000000000","message":"Surely this should be:\n\n  @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027hbase\u0027)\n\ni.e. the point would be to specifically include hbase in the event test coverage, as opposed to excluding it?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"7cd934535519596d2494ef2c74028304081d51ab","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_fece94b3","line":2721,"updated":"2014-06-09 09:21:33.000000000","message":"Whey does this test is disabled for hbase ?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"c670c4f7378cf4d0a5b0f46a3e48eb919304eec1","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_17a15ea9","line":2721,"in_reply_to":"1ae5cdf2_34cc9835","updated":"2014-06-09 13:39:52.000000000","message":"Personally, I\u0027m OK to have the different behavior. \n\nThe only things we need to take care is : Event.UNKNOWN_PROBLEM must never be called in case of duplicate event to ensure the notification message is not requeue into the message queue (to avoid to have messages blocked on the messaging bus).\n\nIn sql, it\u0027s cleary more efficient to catch integrity error,\nAnd in mongo/hbase, it\u0027s clearly efficient to not check anything and just push the latest event.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"a399a8495c2b3b526cd89308839364bbbd27ea26","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_1eda60e9","line":2721,"in_reply_to":"1ae5cdf2_3ecd5c5e","updated":"2014-06-09 09:36:34.000000000","message":"The duplicate error exists to inform the deployer that something bad happen in its platforms. In production, this should never happend, otherwise your rabbit/qpid is sick, or your platform is misconfigured. I\u0027m not sure, changing the behavior is a good idea.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c0799e4269e00b59da435277e9ad3d98d1add8be","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_dc62c0ac","line":2721,"in_reply_to":"1ae5cdf2_616109d3","updated":"2014-06-09 10:43:15.000000000","message":"I guess the questino here is that should we check it from code that HBase does not check for us or if we decide to leave this behavior as is, then we should have a test for HBase which checks that it rewrites the record without any errors or sideeffects.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"90b588e11a995626521aa2989d7cf1f27ed0f014","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_34cc9835","line":2721,"in_reply_to":"1ae5cdf2_dc62c0ac","updated":"2014-06-09 13:13:48.000000000","message":"Ildiko, yes. The problem here that it\u0027s extremely expensive to check that entry does already exist in HBase. Besides, \"if exist then raise Exception else make an insertion\" cannot be transaction-safe in HBase. And I think that we should avoid such checks. But I agree that SQL and HBase behaviour should be the same. Is it really a disaster if some event become rewritten?","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"8b675827ae07ed35ac96c5583666b6453b69962c","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_616109d3","line":2721,"in_reply_to":"1ae5cdf2_de40f809","updated":"2014-06-09 09:51:33.000000000","message":"folks, that not changing the behaviour - it worked before as it were no events for hbase. HBase has no reaction speaking about one more rewriting. It raises no duplicate error - and it did not (this change does not changes this behaviour, its hbase-specific thing - it simply does not raise duplicate error in these cases and that\u0027s it)","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"284221f527194fe94c20b37936ea19f48ed05985","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"class EventTest(EventTestBase):"},{"line_number":2721,"context_line":"    @tests_db.run_with(\u0027sqlite\u0027, \u0027mongodb\u0027, \u0027db2\u0027)"},{"line_number":2722,"context_line":"    def test_duplicate_message_id(self):"},{"line_number":2723,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":2724,"context_line":"        m \u003d [models.Event(\"1\", \"Foo\", now, None),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_3ecd5c5e","line":2721,"in_reply_to":"1ae5cdf2_fece94b3","updated":"2014-06-09 09:31:53.000000000","message":"as in base there is no duplicate error really - if you\u0027ll write the same (exactly the same one with the same key) record will be re-written and that\u0027s it. So this test is meaningless for the HBase case.","commit_id":"70bddbf0b1c419355024960fd3a06a0e3fd6cf3c"}]}
