)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"561c1b4f4097fe84484daff8241b03ffd3b4f99f","unresolved":false,"context_lines":[{"line_number":13,"context_line":"- get_resources and get_meters support metaquery"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I3285bb420283c2385e6f340ff30e951d58dcb450"},{"line_number":16,"context_line":"Implements: hbase-metadata-query"},{"line_number":17,"context_line":"Fixes: bug #1146655"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPH%2F%2F0Kc%3D","line":16,"updated":"2013-05-22 13:16:02.000000000","message":"You need to add blueprint in front of the blueprint name","commit_id":"ec61cb72352e82b5283df0d3103f02ca874f9295"},{"author":{"_account_id":882,"name":"shengjie min","email":"minshengjie@chinacloud.com.cn","username":"shengjie-min"},"change_message_id":"ebbf9f1fe520e1a848d82003c5d4d87bc842b3f1","unresolved":false,"context_lines":[{"line_number":13,"context_line":"- get_resources and get_meters support metaquery"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I3285bb420283c2385e6f340ff30e951d58dcb450"},{"line_number":16,"context_line":"Implements: hbase-metadata-query"},{"line_number":17,"context_line":"Fixes: bug #1146655"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPH%2F%2Fxu4%3D","line":16,"in_reply_to":"AAAAPH%2F%2F0Kc%3D","updated":"2013-05-23 09:24:54.000000000","message":"aha, that explains why it\u0027s not automatically associated with the blueprint itself. will do.","commit_id":"ec61cb72352e82b5283df0d3103f02ca874f9295"}],"ceilometer/storage/impl_hbase.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"118295ee2e331b4a3bb703b940cc7615dcb28f8d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"  (https://ccp.cloudera.com/display/CDHDOC/HBase+Installation)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"  This driver has been tested against HBase 0.92.1/CDH 4.1.1,"},{"line_number":28,"context_line":"  HBase 0.94.4/HDP 1.2 and HBase 0.94.5/Apache."},{"line_number":29,"context_line":"  Versions earlier than 0.92.1 are not supported due to feature"},{"line_number":30,"context_line":"  incompatibility."},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F0Kk%3D","side":"PARENT","line":28,"updated":"2013-05-22 13:15:40.000000000","message":"Where is that gone?","commit_id":"0f57d7573c4f6d00ddb90318c0cdc8d65326eb18"},{"author":{"_account_id":882,"name":"shengjie min","email":"minshengjie@chinacloud.com.cn","username":"shengjie-min"},"change_message_id":"ebbf9f1fe520e1a848d82003c5d4d87bc842b3f1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"  (https://ccp.cloudera.com/display/CDHDOC/HBase+Installation)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"  This driver has been tested against HBase 0.92.1/CDH 4.1.1,"},{"line_number":28,"context_line":"  HBase 0.94.4/HDP 1.2 and HBase 0.94.5/Apache."},{"line_number":29,"context_line":"  Versions earlier than 0.92.1 are not supported due to feature"},{"line_number":30,"context_line":"  incompatibility."},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxvU%3D","side":"PARENT","line":28,"in_reply_to":"AAAAPH%2F%2F0Kk%3D","updated":"2013-05-23 09:24:54.000000000","message":"As I mentioned in the commit msg, I moved the configuration to http://docs.openstack.org/developer/ceilometer/configuration.html#hbase\n\nJust thought no point maintain this copy here too.","commit_id":"0f57d7573c4f6d00ddb90318c0cdc8d65326eb18"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"7552323601ce81f6a406d80dad8e01aa69154acf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"  (https://ccp.cloudera.com/display/CDHDOC/HBase+Installation)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"  This driver has been tested against HBase 0.92.1/CDH 4.1.1,"},{"line_number":28,"context_line":"  HBase 0.94.4/HDP 1.2 and HBase 0.94.5/Apache."},{"line_number":29,"context_line":"  Versions earlier than 0.92.1 are not supported due to feature"},{"line_number":30,"context_line":"  incompatibility."},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fxc0%3D","side":"PARENT","line":28,"in_reply_to":"AAAAPH%2F%2FxvU%3D","updated":"2013-05-23 12:22:47.000000000","message":"Ah ok, I think you were doing it in this commit :)","commit_id":"0f57d7573c4f6d00ddb90318c0cdc8d65326eb18"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"118295ee2e331b4a3bb703b940cc7615dcb28f8d","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                    # e.g. metaquery: metadata.display_name"},{"line_number":335,"context_line":"                    #      equals"},{"line_number":336,"context_line":"                    #      HBase: f:r_display_name"},{"line_number":337,"context_line":"                    if data[\u0027f:r_\u0027 + k.split(\u0027.\u0027)[1]] \u003d\u003d v:"},{"line_number":338,"context_line":"                        yield make_resource(data)"},{"line_number":339,"context_line":"        else:"},{"line_number":340,"context_line":"            for ignored, data in self.resource.rows(resource_ids):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F0LA%3D","line":337,"updated":"2013-05-22 13:15:40.000000000","message":"I think you should use k.split(\u0027.\u0027, 1) to limit the splitting","commit_id":"ec61cb72352e82b5283df0d3103f02ca874f9295"},{"author":{"_account_id":882,"name":"shengjie min","email":"minshengjie@chinacloud.com.cn","username":"shengjie-min"},"change_message_id":"ebbf9f1fe520e1a848d82003c5d4d87bc842b3f1","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                    # e.g. metaquery: metadata.display_name"},{"line_number":335,"context_line":"                    #      equals"},{"line_number":336,"context_line":"                    #      HBase: f:r_display_name"},{"line_number":337,"context_line":"                    if data[\u0027f:r_\u0027 + k.split(\u0027.\u0027)[1]] \u003d\u003d v:"},{"line_number":338,"context_line":"                        yield make_resource(data)"},{"line_number":339,"context_line":"        else:"},{"line_number":340,"context_line":"            for ignored, data in self.resource.rows(resource_ids):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxvI%3D","line":337,"in_reply_to":"AAAAPH%2F%2F0LA%3D","updated":"2013-05-23 09:24:54.000000000","message":"I will take care of this.","commit_id":"ec61cb72352e82b5283df0d3103f02ca874f9295"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"118295ee2e331b4a3bb703b940cc7615dcb28f8d","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                q \u003d []"},{"line_number":361,"context_line":"            for k, v in metaquery.iteritems():"},{"line_number":362,"context_line":"                q.append(\"SingleColumnValueFilter (\u0027f\u0027, \u0027%s\u0027, \u003d, \u0027binary:%s\u0027)\""},{"line_number":363,"context_line":"                         % (\u0027r_\u0027 + k.split(\u0027.\u0027)[1], v))"},{"line_number":364,"context_line":"            for k in q:"},{"line_number":365,"context_line":"                q \u003d \" AND \".join(q)"},{"line_number":366,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F0Ko%3D","line":363,"updated":"2013-05-22 13:15:40.000000000","message":"Same as above.","commit_id":"ec61cb72352e82b5283df0d3103f02ca874f9295"},{"author":{"_account_id":882,"name":"shengjie min","email":"minshengjie@chinacloud.com.cn","username":"shengjie-min"},"change_message_id":"ebbf9f1fe520e1a848d82003c5d4d87bc842b3f1","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                q \u003d []"},{"line_number":361,"context_line":"            for k, v in metaquery.iteritems():"},{"line_number":362,"context_line":"                q.append(\"SingleColumnValueFilter (\u0027f\u0027, \u0027%s\u0027, \u003d, \u0027binary:%s\u0027)\""},{"line_number":363,"context_line":"                         % (\u0027r_\u0027 + k.split(\u0027.\u0027)[1], v))"},{"line_number":364,"context_line":"            for k in q:"},{"line_number":365,"context_line":"                q \u003d \" AND \".join(q)"},{"line_number":366,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxvE%3D","line":363,"in_reply_to":"AAAAPH%2F%2F0Ko%3D","updated":"2013-05-23 09:24:54.000000000","message":"will do","commit_id":"ec61cb72352e82b5283df0d3103f02ca874f9295"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":18,"context_line":"# under the License."},{"line_number":19,"context_line":"\"\"\"HBase storage backend"},{"line_number":20,"context_line":"\"\"\""},{"line_number":21,"context_line":"from sets import Set"},{"line_number":22,"context_line":"from urlparse import urlparse"},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":"import hashlib"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FogU%3D","line":21,"updated":"2013-05-28 21:58:22.000000000","message":"\"set\" is a built-in type in Python 2.6 and 2.7, so you don\u0027t need this import.","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        # store metadata fields with prefix \"r_\""},{"line_number":212,"context_line":"        resource_metadata \u003d dict((\u0027f:r_%s\u0027 % k, v)"},{"line_number":213,"context_line":"                                 for (k, v)"},{"line_number":214,"context_line":"                                 in data[\u0027resource_metadata\u0027].iteritems())"},{"line_number":215,"context_line":"        new_resource.update(resource_metadata)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # Update if resource has new information"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2Foh4%3D","line":214,"updated":"2013-05-28 21:58:22.000000000","message":"I think there may still be cases where the resource_metadata contains complex types as values (lists or dicts). Did you check to see if that was true?","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        :param end_timestamp: Optional modified timestamp end range."},{"line_number":292,"context_line":"        :param metaquery: Optional dict with metadata to match on."},{"line_number":293,"context_line":"        \"\"\""},{"line_number":294,"context_line":"        def make_resource(data):"},{"line_number":295,"context_line":"            \"\"\" transform HBase fields to Resource model"},{"line_number":296,"context_line":"            \"\"\""},{"line_number":297,"context_line":"            # convert HBase metadata e.g. f:r_display_name to display_name"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2Fohs%3D","line":294,"updated":"2013-05-28 21:58:22.000000000","message":"The get_resources method is going to be called a lot. It would be better to move static code definitions like this out of the body of the function, so they are not processed on each call. You can use a private staticmethod of the connection instead (self._make_resource).","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"31be14d44c9a2db1ffa7079a24233825d0afb6cb","unresolved":false,"context_lines":[{"line_number":297,"context_line":"            # convert HBase metadata e.g. f:r_display_name to display_name"},{"line_number":298,"context_line":"            data[\u0027f:metadata\u0027] \u003d dict((k[4:], v)"},{"line_number":299,"context_line":"                                      for k, v in data.iteritems()"},{"line_number":300,"context_line":"                                      if k.startswith(\u0027f:r_\u0027))"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"            return models.Resource("},{"line_number":303,"context_line":"                resource_id\u003ddata[\u0027f:resource_id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2Fp6Q%3D","line":300,"updated":"2013-05-28 14:37:41.000000000","message":"Nitpick: rather than using the literal 4, would this be clearer as something like:\n\n  METADATA_PREFIX \u003d \u0027f:r_\u0027\n  # ... \n  data[\u0027f:metadata\u0027] \u003d dict((k[len(METADATA_PREFIX):], v)\n                             for k, v in data.iteritems()\n\t                     if k.startswith(METADATA_PREFIX))","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        gen \u003d self.meter.scan(filter\u003dq, row_start\u003dstart_row, row_stop\u003dstop_row)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        # put all the resource_ids in a Set"},{"line_number":326,"context_line":"        resource_ids \u003d Set()"},{"line_number":327,"context_line":"        for ignored, data in gen:"},{"line_number":328,"context_line":"            resource_ids.add(data[\u0027f:resource_id\u0027])"},{"line_number":329,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FohA%3D","line":326,"updated":"2013-05-28 21:58:22.000000000","message":"This would be more efficient as a one-liner that doesn\u0027t use a for loop from python:\n\n  resource_ids \u003d set(data[\u0027f:resource_id\u0027] for ignored, data in gen)","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"31be14d44c9a2db1ffa7079a24233825d0afb6cb","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            resource_ids.add(data[\u0027f:resource_id\u0027])"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        # handle metaquery"},{"line_number":331,"context_line":"        if len(metaquery) \u003e 0:"},{"line_number":332,"context_line":"            for ignored, data in self.resource.rows(resource_ids):"},{"line_number":333,"context_line":"                for k, v in metaquery.iteritems():"},{"line_number":334,"context_line":"                    # if metaquery matches, yield the resource model"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2Fp3w%3D","line":331,"updated":"2013-05-28 14:37:41.000000000","message":"Nitpick: in general to avoid a len(None), is \u0027if metequery:\u0027 usually preferable to \u0027if len(metequery):\u0027","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        LOG.debug(\"Query Resource table: %s\" % q)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        # handle metaquery"},{"line_number":359,"context_line":"        if len(metaquery) \u003e 0:"},{"line_number":360,"context_line":"            meta_q \u003d []"},{"line_number":361,"context_line":"            for k, v in metaquery.iteritems():"},{"line_number":362,"context_line":"                meta_q.append("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FogE%3D","line":359,"updated":"2013-05-28 21:58:22.000000000","message":"Same comment about testing len directly.\n\n  if metaquery:\n    blah","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":362,"context_line":"                meta_q.append("},{"line_number":363,"context_line":"                    \"SingleColumnValueFilter (\u0027f\u0027, \u0027%s\u0027, \u003d, \u0027binary:%s\u0027)\""},{"line_number":364,"context_line":"                    % (\u0027r_\u0027 + k.split(\u0027.\u0027, 1)[1], v))"},{"line_number":365,"context_line":"            meta_q \u003d \" AND \".join(meta_q)"},{"line_number":366,"context_line":"            # join query and metaquery"},{"line_number":367,"context_line":"            if q is not None:"},{"line_number":368,"context_line":"                q +\u003d \" AND \" + meta_q"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2Fofc%3D","line":365,"updated":"2013-05-28 21:58:22.000000000","message":"Changing the type of a variable like this makes the code confusing. Consider renaming the string variable, or converting the for loop to a generator expression and just building the string directly.","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                    % (\u0027r_\u0027 + k.split(\u0027.\u0027, 1)[1], v))"},{"line_number":365,"context_line":"            meta_q \u003d \" AND \".join(meta_q)"},{"line_number":366,"context_line":"            # join query and metaquery"},{"line_number":367,"context_line":"            if q is not None:"},{"line_number":368,"context_line":"                q +\u003d \" AND \" + meta_q"},{"line_number":369,"context_line":"            else:"},{"line_number":370,"context_line":"                q \u003d meta_q   # metaquery only"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FofU%3D","line":367,"updated":"2013-05-28 21:58:22.000000000","message":"Can q be not None but also empty?","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":396,"context_line":"    def get_samples(self, sample_filter):"},{"line_number":397,"context_line":"        \"\"\"Return an iterable of models.Sample instances"},{"line_number":398,"context_line":"        \"\"\""},{"line_number":399,"context_line":"        def make_sample(data):"},{"line_number":400,"context_line":"            \"\"\" transform HBase fields to Sample model"},{"line_number":401,"context_line":"            \"\"\""},{"line_number":402,"context_line":"            data \u003d json.loads(data[\u0027f:message\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FohQ%3D","line":399,"updated":"2013-05-28 21:58:22.000000000","message":"See earlier comment about local static functions in methods that are called a lot.","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"432ab812a5ece497e2ba367722676d80e8115663","unresolved":false,"context_lines":[{"line_number":420,"context_line":"                resource \u003d self.resource.row(meter[\u0027f:resource_id\u0027])"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"                for k, v in metaquery.iteritems():"},{"line_number":423,"context_line":"                    if resource[\u0027f:r_\u0027 + k.split(\u0027.\u0027, 1)[1]] !\u003d v:"},{"line_number":424,"context_line":"                        break   # if one metaquery doesn\u0027t match, break"},{"line_number":425,"context_line":"                else:"},{"line_number":426,"context_line":"                    yield make_sample(meter)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FoeE%3D","line":423,"updated":"2013-05-28 21:58:22.000000000","message":"Is the k.split() stuff removing the \"metadata.\" from the front of the query parameter? If so, that should probably be more explicit.","commit_id":"09b4623c576bc6bee9ab459ce8794059cea05285"}]}
