)]}'
{"cinder/common/sqlalchemyutils.py":[{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"419a1020329e61dca895412f5748d872bf3da9eb","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    query \u003d utils.paginate_query(query, model, limit, sort_keys, marker\u003dmarker,"},{"line_number":60,"context_line":"                                 sort_dir\u003dsort_dir, sort_dirs\u003dsort_dirs)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    if offset:"},{"line_number":63,"context_line":"        query \u003d query.offset(offset)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    return query"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_ed1cf36b","line":63,"range":{"start_line":62,"start_character":0,"end_line":63,"end_character":36},"updated":"2017-01-18 04:45:05.000000000","message":"actually, I have been working on this  https://review.openstack.org/#/c/407338/,\n\nhope we can use oslo.db utils directly.","commit_id":"a8274ba6333dbb9bba37509080a29afaebd8d5eb"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2d81e097da51ede876f5e170d12909dfba88d830","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    query \u003d utils.paginate_query(query, model, limit, sort_keys, marker\u003dmarker,"},{"line_number":60,"context_line":"                                 sort_dir\u003dsort_dir, sort_dirs\u003dsort_dirs)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    if offset:"},{"line_number":63,"context_line":"        query \u003d query.offset(offset)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    return query"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_73438413","line":63,"range":{"start_line":62,"start_character":0,"end_line":63,"end_character":36},"in_reply_to":"7a3c09a3_ed1cf36b","updated":"2017-01-18 06:17:52.000000000","message":"I\u0027ll remove these two lines if your patch can be merged and released in this week. Or I\u0027d like to leave a TODO here. Is that OK?","commit_id":"a8274ba6333dbb9bba37509080a29afaebd8d5eb"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"037eb4b54a8dce2696566ce752de0dffe0819f46","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                     marker\u003dmarker, sort_dir\u003dsort_dir,"},{"line_number":65,"context_line":"                                     sort_dirs\u003dsort_dirs)"},{"line_number":66,"context_line":"    except db_exception.InvalidSortKey:"},{"line_number":67,"context_line":"        raise exception.InvalidInput(reason\u003d\u0027Invalid sort key\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    if offset:"},{"line_number":70,"context_line":"        query \u003d query.offset(offset)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_cf92b9f5","line":67,"updated":"2017-01-18 12:38:15.000000000","message":"It would be better to change exception being cached elsewhere, than to repack it. Is it a lot of effort?","commit_id":"a3d1651bcff5132174945f3d22b5109a43168336"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"151815b4d3588026fb21fcc881c3318b0ab48613","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                     marker\u003dmarker, sort_dir\u003dsort_dir,"},{"line_number":65,"context_line":"                                     sort_dirs\u003dsort_dirs)"},{"line_number":66,"context_line":"    except db_exception.InvalidSortKey:"},{"line_number":67,"context_line":"        raise exception.InvalidInput(reason\u003d\u0027Invalid sort key\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    if offset:"},{"line_number":70,"context_line":"        query \u003d query.offset(offset)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_f65d287a","line":67,"in_reply_to":"5a3905b3_0be9b980","updated":"2017-01-20 09:03:51.000000000","message":"Thank you! :)","commit_id":"a3d1651bcff5132174945f3d22b5109a43168336"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"de9282b740b4642d3106550a1f153a406953c9c8","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                     marker\u003dmarker, sort_dir\u003dsort_dir,"},{"line_number":65,"context_line":"                                     sort_dirs\u003dsort_dirs)"},{"line_number":66,"context_line":"    except db_exception.InvalidSortKey:"},{"line_number":67,"context_line":"        raise exception.InvalidInput(reason\u003d\u0027Invalid sort key\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    if offset:"},{"line_number":70,"context_line":"        query \u003d query.offset(offset)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_0be9b980","line":67,"in_reply_to":"5a3905b3_70cb3873","updated":"2017-01-20 01:43:04.000000000","message":"I\u0027ll try. Thanks!","commit_id":"a3d1651bcff5132174945f3d22b5109a43168336"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"09651974648b4f705f5de3d7351e8d5292c2b032","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                     marker\u003dmarker, sort_dir\u003dsort_dir,"},{"line_number":65,"context_line":"                                     sort_dirs\u003dsort_dirs)"},{"line_number":66,"context_line":"    except db_exception.InvalidSortKey:"},{"line_number":67,"context_line":"        raise exception.InvalidInput(reason\u003d\u0027Invalid sort key\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    if offset:"},{"line_number":70,"context_line":"        query \u003d query.offset(offset)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_70cb3873","line":67,"in_reply_to":"5a3905b3_7346f8c0","updated":"2017-01-19 11:47:01.000000000","message":"Right, so are we simply able to add it to our WSGI layer? Somewhere there [1]?\n\n[1] https://github.com/openstack/cinder/blob/ffcac6ab83abef993899bcf831c102cbb3daef90/cinder/api/openstack/wsgi.py#L600-L602","commit_id":"a3d1651bcff5132174945f3d22b5109a43168336"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"c9fe8e50f4b3d56fe1619952302aaf45e4fde7e1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                     marker\u003dmarker, sort_dir\u003dsort_dir,"},{"line_number":65,"context_line":"                                     sort_dirs\u003dsort_dirs)"},{"line_number":66,"context_line":"    except db_exception.InvalidSortKey:"},{"line_number":67,"context_line":"        raise exception.InvalidInput(reason\u003d\u0027Invalid sort key\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    if offset:"},{"line_number":70,"context_line":"        query \u003d query.offset(offset)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_7346f8c0","line":67,"in_reply_to":"7a3c09a3_cf92b9f5","updated":"2017-01-19 02:10:31.000000000","message":"Many APIs use this function, but actually they dont\u0027 catch this error. InvalidInput error is handled by wsgi. So here is the place we can raise the error easily IMHO.","commit_id":"a3d1651bcff5132174945f3d22b5109a43168336"},{"author":{"_account_id":23602,"name":"Michael Dovgal","email":"dovgalmichael@gmail.com","username":"mdovgal"},"change_message_id":"c24039e31360bbf83cec95d932ef6237824d3df8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# copied from glance/db/sqlalchemy/api.py"},{"line_number":35,"context_line":"def _get_default_column_value(column_type):"},{"line_number":36,"context_line":"    \"\"\"Return the default value of the columns from DB table"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_0df6c8f8","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":41},"updated":"2017-01-23 10:10:36.000000000","message":"I think we don\u0027t need this comment. Actually, somebody can move this method to other file in glance or something like this and this comment won\u0027t be valid.","commit_id":"11eaf71cb9bada2f6fcaeaf3a2e26bfcfda9facc"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6655f79475bbe4f92472e30ec95c92b222b35cbc","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _get_default_column_value(column_type):"},{"line_number":35,"context_line":"    \"\"\"Return the default value of the columns from DB table"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    In postgreDB case, if no right default values are being set, an"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_a5bd8d03","line":34,"updated":"2017-01-24 11:18:20.000000000","message":"?: Why are we only using the column type and not the defaults defined in the model?","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9751bc8ae8a45cbcdfd12f8fa73ea4fdc05b4e66","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _get_default_column_value(column_type):"},{"line_number":35,"context_line":"    \"\"\"Return the default value of the columns from DB table"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    In postgreDB case, if no right default values are being set, an"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_f0471549","line":34,"in_reply_to":"5a3905b3_0e7d6ce7","updated":"2017-01-25 11:51:37.000000000","message":"You can query `default` attribute from the `InstrumentedAttribute` to see if there\u0027s a default.\n\nIf the value is `None` then there\u0027s no default, otherwise you\u0027ll have a `ColumDefault` instance, and for most cases you can just get the value in the `arg` attribute (I say most cases because we could be setting the default via a hook, but I don\u0027t think we do that in Cinder).\n\nSo `type(marker).bootable.default.arg` will give you False.","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d46a481eccf8707cf8873b95bcf86620c62dc38c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _get_default_column_value(column_type):"},{"line_number":35,"context_line":"    \"\"\"Return the default value of the columns from DB table"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    In postgreDB case, if no right default values are being set, an"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_0e7d6ce7","line":34,"in_reply_to":"5a3905b3_a5bd8d03","updated":"2017-01-25 08:15:25.000000000","message":"model_attr at L136 is a sqlalchemy.orm.attributes.InstrumentedAttribute object. Can\u0027t find a way to use the model here. \n\nCan you give me any solution here. Thanks.","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6655f79475bbe4f92472e30ec95c92b222b35cbc","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        for sort_key in sort_keys:"},{"line_number":126,"context_line":"            v \u003d getattr(marker, sort_key)"},{"line_number":127,"context_line":"            if v is None:"},{"line_number":128,"context_line":"                v \u003d default"},{"line_number":129,"context_line":"            marker_values.append(v)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Build up an array of sort criteria as in the docstring"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_256d1dcc","line":128,"updated":"2017-01-24 11:18:20.000000000","message":"-1: This is wrong, as it could mean that we\u0027ll be comparing \u0027\u0027 with 0 on L142 if the field is an int and has None value","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d46a481eccf8707cf8873b95bcf86620c62dc38c","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        for sort_key in sort_keys:"},{"line_number":126,"context_line":"            v \u003d getattr(marker, sort_key)"},{"line_number":127,"context_line":"            if v is None:"},{"line_number":128,"context_line":"                v \u003d default"},{"line_number":129,"context_line":"            marker_values.append(v)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Build up an array of sort criteria as in the docstring"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_6ef7d08c","line":128,"in_reply_to":"5a3905b3_256d1dcc","updated":"2017-01-25 08:15:25.000000000","message":"Yes, Nice catch. I\u0027ll fix it in the next ps.","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6655f79475bbe4f92472e30ec95c92b222b35cbc","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                model_attr \u003d getattr(model, sort_keys[j])"},{"line_number":137,"context_line":"                default \u003d _get_default_column_value("},{"line_number":138,"context_line":"                    model_attr.property.columns[0].type)"},{"line_number":139,"context_line":"                attr \u003d sa_sql.expression.case([(model_attr !\u003d None,  # noqa"},{"line_number":140,"context_line":"                                                model_attr), ],"},{"line_number":141,"context_line":"                                              else_\u003ddefault)"},{"line_number":142,"context_line":"                crit_attrs.append((attr \u003d\u003d marker_values[j]))"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_42a77f0a","line":139,"updated":"2017-01-24 11:18:20.000000000","message":"-1: Don\u0027t use !\u003d for None, use isnot method from model_attr","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d46a481eccf8707cf8873b95bcf86620c62dc38c","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                model_attr \u003d getattr(model, sort_keys[j])"},{"line_number":137,"context_line":"                default \u003d _get_default_column_value("},{"line_number":138,"context_line":"                    model_attr.property.columns[0].type)"},{"line_number":139,"context_line":"                attr \u003d sa_sql.expression.case([(model_attr !\u003d None,  # noqa"},{"line_number":140,"context_line":"                                                model_attr), ],"},{"line_number":141,"context_line":"                                              else_\u003ddefault)"},{"line_number":142,"context_line":"                crit_attrs.append((attr \u003d\u003d marker_values[j]))"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_b375a533","line":139,"in_reply_to":"5a3905b3_42a77f0a","updated":"2017-01-25 08:15:25.000000000","message":"Done","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6655f79475bbe4f92472e30ec95c92b222b35cbc","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                attr \u003d sa_sql.expression.case([(model_attr !\u003d None,  # noqa"},{"line_number":140,"context_line":"                                                model_attr), ],"},{"line_number":141,"context_line":"                                              else_\u003ddefault)"},{"line_number":142,"context_line":"                crit_attrs.append((attr \u003d\u003d marker_values[j]))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"            model_attr \u003d getattr(model, sort_keys[i])"},{"line_number":145,"context_line":"            default \u003d _get_default_column_value("}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_25afdd7d","line":142,"updated":"2017-01-24 11:18:20.000000000","message":"?: Why don\u0027t we just change this to attr.is_(None) when the value is None?","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d46a481eccf8707cf8873b95bcf86620c62dc38c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                attr \u003d sa_sql.expression.case([(model_attr !\u003d None,  # noqa"},{"line_number":140,"context_line":"                                                model_attr), ],"},{"line_number":141,"context_line":"                                              else_\u003ddefault)"},{"line_number":142,"context_line":"                crit_attrs.append((attr \u003d\u003d marker_values[j]))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"            model_attr \u003d getattr(model, sort_keys[i])"},{"line_number":145,"context_line":"            default \u003d _get_default_column_value("}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_935a694f","line":142,"in_reply_to":"5a3905b3_25afdd7d","updated":"2017-01-25 08:15:25.000000000","message":"attr here supports \"\u003d\u003d\" and \"!\u003d\" with None. But doesn\u0027t support \"\u003e\" or \"\u003c\" with None, like L151.\n\nSo the error is not raised here. Any way, use \"is_(None)\" here or not are both OK.","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9751bc8ae8a45cbcdfd12f8fa73ea4fdc05b4e66","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                attr \u003d sa_sql.expression.case([(model_attr !\u003d None,  # noqa"},{"line_number":140,"context_line":"                                                model_attr), ],"},{"line_number":141,"context_line":"                                              else_\u003ddefault)"},{"line_number":142,"context_line":"                crit_attrs.append((attr \u003d\u003d marker_values[j]))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"            model_attr \u003d getattr(model, sort_keys[i])"},{"line_number":145,"context_line":"            default \u003d _get_default_column_value("}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_1a176055","line":142,"in_reply_to":"5a3905b3_935a694f","updated":"2017-01-25 11:51:37.000000000","message":"That\u0027s what I was missing, the \u003c and \u003e operators we use, thanks.","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6655f79475bbe4f92472e30ec95c92b222b35cbc","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            model_attr \u003d getattr(model, sort_keys[i])"},{"line_number":145,"context_line":"            default \u003d _get_default_column_value("},{"line_number":146,"context_line":"                model_attr.property.columns[0].type)"},{"line_number":147,"context_line":"            attr \u003d sa_sql.expression.case([(model_attr !\u003d None,  # noqa"},{"line_number":148,"context_line":"                                            model_attr), ],"},{"line_number":149,"context_line":"                                          else_\u003ddefault)"},{"line_number":150,"context_line":"            if sort_dirs[i] \u003d\u003d \u0027desc\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_82ade7ea","line":147,"updated":"2017-01-24 11:18:20.000000000","message":"-1: ditto","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d46a481eccf8707cf8873b95bcf86620c62dc38c","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            model_attr \u003d getattr(model, sort_keys[i])"},{"line_number":145,"context_line":"            default \u003d _get_default_column_value("},{"line_number":146,"context_line":"                model_attr.property.columns[0].type)"},{"line_number":147,"context_line":"            attr \u003d sa_sql.expression.case([(model_attr !\u003d None,  # noqa"},{"line_number":148,"context_line":"                                            model_attr), ],"},{"line_number":149,"context_line":"                                          else_\u003ddefault)"},{"line_number":150,"context_line":"            if sort_dirs[i] \u003d\u003d \u0027desc\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_d3723149","line":147,"in_reply_to":"5a3905b3_82ade7ea","updated":"2017-01-25 08:15:25.000000000","message":"Done","commit_id":"f4ae884c6e7f02d6c8065e5ad3c3a05f2482a804"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"2c34f60031d820b4361af7c2f52296ad5df3b14c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _get_default_column_value(column_type):"},{"line_number":36,"context_line":"    \"\"\"Return the default value of the columns from DB table"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    In postgreDB case, if no right default values are being set, an"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a3905b3_1081014e","line":35,"updated":"2017-01-25 11:52:00.000000000","message":"-1: As mentioned in previous patch, I think we should be taking into consideration the default values of the fields as well.","commit_id":"a9522f4a424ead0b03e06a64516fee5992d94590"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"f16625a890987cc2a28c2d20f95f4daa86820698","unresolved":false,"context_lines":[{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _get_default_column_value(column_type):"},{"line_number":36,"context_line":"    \"\"\"Return the default value of the columns from DB table"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    In postgreDB case, if no right default values are being set, an"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a461143_52f2d49b","line":35,"in_reply_to":"5a3905b3_1081014e","updated":"2017-01-25 13:50:23.000000000","message":"Sure, Will think and try it. Thanks.","commit_id":"a9522f4a424ead0b03e06a64516fee5992d94590"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"2c34f60031d820b4361af7c2f52296ad5df3b14c","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            if v is None:"},{"line_number":129,"context_line":"                marker_attr \u003d getattr(type(marker), sort_key)"},{"line_number":130,"context_line":"                v \u003d _get_default_column_value("},{"line_number":131,"context_line":"                    marker_attr.property.columns[0].type)"},{"line_number":132,"context_line":"            marker_values.append(v)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # Build up an array of sort criteria as in the docstring"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a3905b3_105d81ec","line":131,"updated":"2017-01-25 11:52:00.000000000","message":"nit: Since we\u0027ll need to access the `default` attribute as well as the type in the method we should just pass the `marker_attr`.","commit_id":"a9522f4a424ead0b03e06a64516fee5992d94590"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"65a09b69ec2450b47dfd8001b66a74ac2afe73a1","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    # a default value which is not None."},{"line_number":45,"context_line":"    if attr.default and isinstance(attr.default, type_api.TypeEngine):"},{"line_number":46,"context_line":"        return attr.default.arg"},{"line_number":47,"context_line":"    else:"},{"line_number":48,"context_line":"        attr_type \u003d attr.type"},{"line_number":49,"context_line":"        type_schema \u003d {"},{"line_number":50,"context_line":"            \u0027datetime\u0027: datetime.datetime(1900, 1, 1),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_f1164ea6","line":47,"range":{"start_line":47,"start_character":4,"end_line":47,"end_character":8},"updated":"2017-02-03 11:51:11.000000000","message":"nit: No need for the else word, since the return will already prevent execution from executing remaining code.","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"902e0eda0575398edab9234281c36f9eb4da2dd9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    # a default value which is not None."},{"line_number":45,"context_line":"    if attr.default and isinstance(attr.default, type_api.TypeEngine):"},{"line_number":46,"context_line":"        return attr.default.arg"},{"line_number":47,"context_line":"    else:"},{"line_number":48,"context_line":"        attr_type \u003d attr.type"},{"line_number":49,"context_line":"        type_schema \u003d {"},{"line_number":50,"context_line":"            \u0027datetime\u0027: datetime.datetime(1900, 1, 1),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_e473d2af","line":47,"range":{"start_line":47,"start_character":4,"end_line":47,"end_character":8},"in_reply_to":"1a430d35_f1164ea6","updated":"2017-02-04 01:32:12.000000000","message":"Done","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"65a09b69ec2450b47dfd8001b66a74ac2afe73a1","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return attr.default.arg"},{"line_number":47,"context_line":"    else:"},{"line_number":48,"context_line":"        attr_type \u003d attr.type"},{"line_number":49,"context_line":"        type_schema \u003d {"},{"line_number":50,"context_line":"            \u0027datetime\u0027: datetime.datetime(1900, 1, 1),"},{"line_number":51,"context_line":"            \u0027big_integer\u0027: 0,"},{"line_number":52,"context_line":"            \u0027integer\u0027: 0,"},{"line_number":53,"context_line":"            \u0027string\u0027: \u0027\u0027"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        return type_schema[attr_type.__visit_name__]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_71517e62","line":54,"range":{"start_line":49,"start_character":0,"end_line":54,"end_character":9},"updated":"2017-02-03 11:51:11.000000000","message":"nit: Since these are constants they should probably go out of the method so we don\u0027t have to create and destroy the dictionary on every method call.","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"902e0eda0575398edab9234281c36f9eb4da2dd9","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return attr.default.arg"},{"line_number":47,"context_line":"    else:"},{"line_number":48,"context_line":"        attr_type \u003d attr.type"},{"line_number":49,"context_line":"        type_schema \u003d {"},{"line_number":50,"context_line":"            \u0027datetime\u0027: datetime.datetime(1900, 1, 1),"},{"line_number":51,"context_line":"            \u0027big_integer\u0027: 0,"},{"line_number":52,"context_line":"            \u0027integer\u0027: 0,"},{"line_number":53,"context_line":"            \u0027string\u0027: \u0027\u0027"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        return type_schema[attr_type.__visit_name__]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_04b0de42","line":54,"range":{"start_line":49,"start_character":0,"end_line":54,"end_character":9},"in_reply_to":"1a430d35_71517e62","updated":"2017-02-04 01:32:12.000000000","message":"Done","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"65a09b69ec2450b47dfd8001b66a74ac2afe73a1","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            \u0027integer\u0027: 0,"},{"line_number":53,"context_line":"            \u0027string\u0027: \u0027\u0027"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        return type_schema[attr_type.__visit_name__]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# TODO(wangxiyuan): Use oslo_db.sqlalchemy.utils.paginate_query once it is"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_b19046ee","line":55,"updated":"2017-02-03 11:51:11.000000000","message":"?: What if the type is not one of the ones we have defined in type_schema?  This would raise a KeyError exception.  I think this is acceptable for the time being, since it will return the same 500 error we are getting now.","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"902e0eda0575398edab9234281c36f9eb4da2dd9","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            \u0027integer\u0027: 0,"},{"line_number":53,"context_line":"            \u0027string\u0027: \u0027\u0027"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        return type_schema[attr_type.__visit_name__]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# TODO(wangxiyuan): Use oslo_db.sqlalchemy.utils.paginate_query once it is"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_a4170aa2","line":55,"in_reply_to":"1a430d35_b19046ee","updated":"2017-02-04 01:32:12.000000000","message":"Yes, It\u0027s enough at this moment. but it will raise 500 error here if we\u0027ll add other kind formats column to db in the future.\n\nIt\u0027s hard to update it now IMO. Maybe leave as it is?","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"4bec5fa8b59bfa9e0eda231bfc7a5fe2c3ba0b5b","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                attr \u003d sa_sql.expression.case([(model_attr.isnot(None),"},{"line_number":145,"context_line":"                                                model_attr), ],"},{"line_number":146,"context_line":"                                              else_\u003ddefault)"},{"line_number":147,"context_line":"                crit_attrs.append((attr \u003d\u003d marker_values[j]))"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            model_attr \u003d getattr(model, sort_keys[i])"},{"line_number":150,"context_line":"            default \u003d _get_default_column_value(model, sort_keys[i])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a430d35_aa87d15f","line":147,"range":{"start_line":147,"start_character":34,"end_line":147,"end_character":60},"updated":"2017-02-04 02:50:58.000000000","message":"it\u0027s existing code, but redundant parentless","commit_id":"6c01699023a674a3a28ca4866993bdd3763f322b"}],"cinder/tests/unit/test_paginate_query.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"65a09b69ec2450b47dfd8001b66a74ac2afe73a1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.model \u003d models.Volume"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_paginate_query_marker_null(self):"},{"line_number":30,"context_line":"        marker_object \u003d models.Volume()"},{"line_number":31,"context_line":"        self.assertIsNone(marker_object.display_name)"},{"line_number":32,"context_line":"        self.assertIsNone(marker_object.updated_at)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_ec9f55b2","line":30,"range":{"start_line":30,"start_character":24,"end_line":30,"end_character":39},"updated":"2017-02-03 11:51:11.000000000","message":"nit: self.model()","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"902e0eda0575398edab9234281c36f9eb4da2dd9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.model \u003d models.Volume"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_paginate_query_marker_null(self):"},{"line_number":30,"context_line":"        marker_object \u003d models.Volume()"},{"line_number":31,"context_line":"        self.assertIsNone(marker_object.display_name)"},{"line_number":32,"context_line":"        self.assertIsNone(marker_object.updated_at)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_04de1e6d","line":30,"range":{"start_line":30,"start_character":24,"end_line":30,"end_character":39},"in_reply_to":"1a430d35_ec9f55b2","updated":"2017-02-04 01:32:12.000000000","message":"Done","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"65a09b69ec2450b47dfd8001b66a74ac2afe73a1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        # There is no error raised here."},{"line_number":35,"context_line":"        sqlalchemyutils.paginate_query(self.query, self.model, 10,"},{"line_number":36,"context_line":"                                       sort_keys\u003d[\u0027display_name\u0027,"},{"line_number":37,"context_line":"                                                  \u0027updated_at\u0027],"},{"line_number":38,"context_line":"                                       marker\u003dmarker_object,"},{"line_number":39,"context_line":"                                       sort_dirs\u003d[\u0027desc\u0027, \u0027asc\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_8cf171d0","line":37,"updated":"2017-02-03 11:51:11.000000000","message":"nit: It would be good if we could add an integer type as well.","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"902e0eda0575398edab9234281c36f9eb4da2dd9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        # There is no error raised here."},{"line_number":35,"context_line":"        sqlalchemyutils.paginate_query(self.query, self.model, 10,"},{"line_number":36,"context_line":"                                       sort_keys\u003d[\u0027display_name\u0027,"},{"line_number":37,"context_line":"                                                  \u0027updated_at\u0027],"},{"line_number":38,"context_line":"                                       marker\u003dmarker_object,"},{"line_number":39,"context_line":"                                       sort_dirs\u003d[\u0027desc\u0027, \u0027asc\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_84d04e55","line":37,"in_reply_to":"1a430d35_8cf171d0","updated":"2017-02-04 01:32:12.000000000","message":"Done, add \"size\" here.","commit_id":"df911849c90bbcdfaaad667e9359aa2ad6334b0a"}]}
