@@ -35,40 +35,23 @@ def __getitem__(self, key):
35
35
if not isinstance (name , (str , type (None ))):
36
36
raise TypeError ('serie_name must be an str or None' )
37
37
38
- for result in self .raw ['results' ]:
39
- for serie in result ['series' ]:
40
- serie_name = serie .get ('name' , None )
41
- if serie_name is None :
42
- # this is a "system" query or a query which
43
- # doesn't return a name attribute.
44
- # like 'show retention policies' ..
45
- if key is None :
46
- for point in serie ['values' ]:
47
- yield Point (None , serie ['columns' ], point )
38
+ for serie in self ._get_series ():
39
+ serie_name = serie .get ('name' , None )
40
+ if serie_name is None :
41
+ # this is a "system" query or a query which
42
+ # doesn't return a name attribute.
43
+ # like 'show retention policies' ..
44
+ if key is None :
45
+ for point in serie ['values' ]:
46
+ yield Point (None , serie ['columns' ], point )
48
47
49
- elif name in (None , serie_name ):
50
- # by default if no tags was provided then
51
- # we will matches every returned serie
52
- serie_matches = True
53
- serie_tags = serie .get ('tags' , {})
54
- if tags :
55
- serie_matches = False
56
- # if there are some tags requested,
57
- # let's check them:
58
- for tag_name , tag_value in tags .items ():
59
- # using _sentinel as I'm not sure that "None"
60
- # could be used, because it could be a valid
61
- # serie_tags value : when a serie has no such tag
62
- # then I think it's set to /null/None/.. TBC..
63
- serie_tag_value = serie_tags .get (tag_name , _sentinel )
64
- if serie_tag_value != tag_value :
65
- break
66
- else :
67
- serie_matches = True
68
-
69
- if serie_matches :
70
- for point in serie ['values' ]:
71
- yield Point (serie_name , serie ['columns' ], point , serie_tags )
48
+ elif name in (None , serie_name ):
49
+ # by default if no tags was provided then
50
+ # we will matches every returned serie
51
+ serie_tags = serie .get ('tags' , {})
52
+ if tags is None or self ._tag_matches (serie_tags , tags ):
53
+ for point in serie ['values' ]:
54
+ yield Point (serie_name , serie ['columns' ], point , serie_tags )
72
55
73
56
def __repr__ (self ):
74
57
return str (self .raw )
@@ -80,5 +63,42 @@ def __iter__(self):
80
63
for serie in results ['series' ]:
81
64
yield serie
82
65
83
- #def __len__(self):
84
- # return len(self.raw)
66
+ def _tag_matches (self , tags , filter ):
67
+ """Checks if all key/values in filter match in tags"""
68
+ for tag_name , tag_value in filter .items ():
69
+ # using _sentinel as I'm not sure that "None"
70
+ # could be used, because it could be a valid
71
+ # serie_tags value : when a serie has no such tag
72
+ # then I think it's set to /null/None/.. TBC..
73
+ serie_tag_value = tags .get (tag_name , _sentinel )
74
+ if serie_tag_value != tag_value :
75
+ return False
76
+ return True
77
+
78
+ def _get_series (self ):
79
+ """Returns all series"""
80
+ series = []
81
+ try :
82
+ for result in self .raw ['results' ]:
83
+ series .extend (result ['series' ])
84
+ except KeyError :
85
+ pass
86
+ return series
87
+
88
+ def __len__ (self ):
89
+ return len (self .keys ())
90
+
91
+ def keys (self ):
92
+ keys = []
93
+ for serie in self ._get_series ():
94
+ keys .append ((serie ['name' ], serie ['tags' ]))
95
+ return keys
96
+
97
+ def items (self ):
98
+ items = []
99
+ for serie in self ._get_series ():
100
+ serie_key = (serie ['name' ], serie ['tags' ])
101
+ items .append (
102
+ (serie_key , self .__getitem__ (serie_key ))
103
+ )
104
+ return items
0 commit comments