Skip to content

Commit 2345cf7

Browse files
authored
Merge pull request #235 from Helene/rework_topo
Refactor matadata parser
2 parents 64fb3ff + 6222106 commit 2345cf7

File tree

1 file changed

+29
-15
lines changed

1 file changed

+29
-15
lines changed

source/queryHandler/Topo.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
@author: HWASSMAN
2121
'''
2222

23-
24-
from collections import defaultdict
23+
import copy
24+
from collections import defaultdict, OrderedDict
2525
from typing import Set, List, Dict, DefaultDict
2626

27+
import analytics
28+
from utils import get_runtime_statistics
29+
2730
# dict.iteritems() deprecated in python 3
2831
iterval = lambda d: (getattr(d, 'itervalues', None) or d.values)()
2932

@@ -44,6 +47,7 @@ def __init__(self, jsonStr=None):
4447
if self.topo:
4548
self._processMetadata(self.topo)
4649

50+
@get_runtime_statistics(enabled=analytics.runtime_profiling)
4751
def _processMetadata(self, metadata):
4852
'''
4953
For each component of the highest level (cluster or cluster_node) splits metadata in
@@ -56,22 +60,24 @@ def _processMetadata(self, metadata):
5660
_components = defaultdict(set)
5761
# filters dictionary, per sensor, per (cluster or cluster_node) component
5862
_filters = defaultdict(list)
63+
# ordered dictionary to store filedLabel:fieldName pairs in order as they occur in metaStr
64+
_tags = OrderedDict()
5965
# name of the (cluster or cluster_node) component
6066
label = metaStr.get('fieldLabel')
6167

6268
if label in self.__compTree.keys():
6369
_components = self.__compTree[label]['componentsMap']
6470
_filters = self.__compTree[label]['filtersMap']
6571

66-
self._parse_topoJSONStr(self.__metricsDef, self.__metricsType, self.__levels, self.__ids, self.__groupKeys, _components, _filters, metaStr)
72+
self._parse_topoJSONStr(self.__metricsDef, self.__metricsType, self.__levels, self.__ids, self.__groupKeys, _components, _filters, _tags, metaStr)
6773
tree_entry = {}
6874
tree_entry['componentsMap'] = _components
6975
tree_entry['filtersMap'] = _filters
7076

7177
# comp_tree[label] = tree_entry
7278
self.__compTree[label] = tree_entry
7379

74-
def _parse_topoJSONStr(self, metrics, metricsType, levels, ids, groupKeys, components, filters, metaStr):
80+
def _parse_topoJSONStr(self, metrics, metricsType, levels, ids, groupKeys, components, filters, _tags, metaStr):
7581
'''
7682
This function parses the 'node' or 'attribute' object found in the given JSON string (metaStr) in
7783
the componets or metrics dictionary. Also the used metric filters (per sensor) will be stored
@@ -85,12 +91,20 @@ def _parse_topoJSONStr(self, metrics, metricsType, levels, ids, groupKeys, compo
8591

8692
# check if entity is a component
8793
if metaStr['type'] == 'node':
94+
if field_name == "sensor":
95+
# remove all partialKey tags from _tags dict except parent since we step in the new sensor level metaKey
96+
parent = _tags.popitem(last=False)
97+
_tags.clear()
98+
_tags.update([parent])
99+
else:
100+
_tags[field_name] = field_value
101+
88102
if field_value not in components[field_name]:
89103
components[field_name].add(field_value)
90104
# check if metaStr includes next level metaStr
91105
if 'keys' in metaStr and len(metaStr['keys']) > 0:
92106
for metaKey in metaStr['keys']:
93-
self._parse_topoJSONStr(metrics, metricsType, levels, ids, groupKeys, components, filters, metaKey)
107+
self._parse_topoJSONStr(metrics, metricsType, levels, ids, groupKeys, components, filters, _tags, metaKey)
94108

95109
# check if entity is a metric
96110
elif metaStr['type'] == 'attribute':
@@ -107,17 +121,17 @@ def _parse_topoJSONStr(self, metrics, metricsType, levels, ids, groupKeys, compo
107121
if groupKey not in groupKeys:
108122
# parse sensor relevant data f.e. groupKey, filters, levels
109123
groupKeys[groupKey] = len(groupKeys) + 1
110-
tags = {}
111-
levTree = {}
112-
for i, compValue in enumerate(partKey):
113-
for compLabel in components:
114-
if compValue in components[compLabel]:
115-
levTree[i + 1] = compLabel
116-
tags[compLabel] = compValue
117-
# if tags not in filters[sensor]:
118-
# not needed as groupkeys check will allow this to be reached only once
119-
filters[sensor].append(tags)
124+
group_tags = copy.deepcopy(_tags)
125+
126+
# if not all((value in tags.values()) for value in partKey):
127+
# rint("different key values")
128+
129+
filters[sensor].append(group_tags)
120130
if sensor not in levels:
131+
levTree = {}
132+
for i, tag_key in enumerate(group_tags.keys()):
133+
levTree[i + 1] = tag_key
134+
121135
levels[sensor] = levTree
122136

123137
# parse key id

0 commit comments

Comments
 (0)