You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_querier.py 23 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. # Copyright 2020 Huawei Technologies Co., Ltd
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # ============================================================================
  15. """Test the querier module."""
  16. import time
  17. from unittest import TestCase, mock
  18. from unittest.mock import MagicMock
  19. from google.protobuf.json_format import ParseDict
  20. import mindinsight.datavisual.proto_files.mindinsight_lineage_pb2 as summary_pb2
  21. from mindinsight.lineagemgr.common.exceptions.exceptions import LineageParamTypeError, LineageQuerierParamException
  22. from mindinsight.lineagemgr.lineage_parser import LineageOrganizer
  23. from mindinsight.lineagemgr.querier.querier import Querier
  24. from mindinsight.lineagemgr.summary.lineage_summary_analyzer import LineageInfo
  25. from . import event_data
  26. from ....utils.tools import assert_equal_lineages
  27. def create_lineage_info(train_event_dict, eval_event_dict, dataset_event_dict):
  28. """
  29. Create parsed lineage info tuple.
  30. Args:
  31. train_event_dict (Union[dict, None]): The dict of train event.
  32. eval_event_dict (Union[dict, None]): The dict of evaluation event.
  33. dataset_event_dict (Union[dict, None]): The dict of dataset graph event.
  34. Returns:
  35. namedtuple, parsed lineage info.
  36. """
  37. if train_event_dict is not None:
  38. train_event = summary_pb2.LineageEvent()
  39. ParseDict(train_event_dict, train_event)
  40. else:
  41. train_event = None
  42. if eval_event_dict is not None:
  43. eval_event = summary_pb2.LineageEvent()
  44. ParseDict(eval_event_dict, eval_event)
  45. else:
  46. eval_event = None
  47. if dataset_event_dict is not None:
  48. dataset_event = summary_pb2.LineageEvent()
  49. ParseDict(dataset_event_dict, dataset_event)
  50. else:
  51. dataset_event = None
  52. lineage_info = LineageInfo(
  53. train_lineage=train_event,
  54. eval_lineage=eval_event,
  55. dataset_graph=dataset_event,
  56. )
  57. return lineage_info
  58. def create_filtration_result(summary_dir, train_event_dict,
  59. eval_event_dict, metric_dict, dataset_dict):
  60. """
  61. Create filteration result.
  62. Args:
  63. summary_dir (str): The summary dir.
  64. train_event_dict (dict): The dict of train event.
  65. eval_event_dict (dict): The dict of evaluation event.
  66. metric_dict (dict): The dict of metric.
  67. dataset_dict (dict): The dict of dataset graph.
  68. Returns:
  69. dict, the filteration result.
  70. """
  71. filtration_result = {
  72. "summary_dir": summary_dir,
  73. "model_lineage": {
  74. "loss_function": train_event_dict['train_lineage']['hyper_parameters']['loss_function'],
  75. "train_dataset_path": train_event_dict['train_lineage']['train_dataset']['train_dataset_path'],
  76. "train_dataset_count": train_event_dict['train_lineage']['train_dataset']['train_dataset_size'],
  77. "test_dataset_path": eval_event_dict['evaluation_lineage']['valid_dataset']['valid_dataset_path'],
  78. "test_dataset_count": eval_event_dict['evaluation_lineage']['valid_dataset']['valid_dataset_size'],
  79. "network": train_event_dict['train_lineage']['algorithm']['network'],
  80. "optimizer": train_event_dict['train_lineage']['hyper_parameters']['optimizer'],
  81. "learning_rate": train_event_dict['train_lineage']['hyper_parameters']['learning_rate'],
  82. "epoch": train_event_dict['train_lineage']['hyper_parameters']['epoch'],
  83. "batch_size": train_event_dict['train_lineage']['hyper_parameters']['batch_size'],
  84. "device_num": train_event_dict['train_lineage']['hyper_parameters']['device_num'],
  85. "loss": train_event_dict['train_lineage']['algorithm']['loss'],
  86. "model_size": train_event_dict['train_lineage']['model']['size'],
  87. "metric": metric_dict,
  88. "dataset_mark": '2',
  89. "user_defined": {}
  90. },
  91. "dataset_graph": dataset_dict,
  92. }
  93. return filtration_result
  94. def get_lineage_infos():
  95. """
  96. Get tuples of lineage info, simulate the function of summary analyzer.
  97. Returns:
  98. list[namedtuple], tuples of lineage info.
  99. """
  100. train_events = [
  101. event_data.EVENT_TRAIN_DICT_0,
  102. event_data.EVENT_TRAIN_DICT_1,
  103. event_data.EVENT_TRAIN_DICT_2,
  104. event_data.EVENT_TRAIN_DICT_3,
  105. event_data.EVENT_TRAIN_DICT_4,
  106. event_data.EVENT_TRAIN_DICT_5,
  107. None
  108. ]
  109. eval_events = [
  110. event_data.EVENT_EVAL_DICT_0,
  111. event_data.EVENT_EVAL_DICT_1,
  112. event_data.EVENT_EVAL_DICT_2,
  113. event_data.EVENT_EVAL_DICT_3,
  114. event_data.EVENT_EVAL_DICT_4,
  115. None,
  116. event_data.EVENT_EVAL_DICT_5
  117. ]
  118. dataset_events = [
  119. event_data.EVENT_DATASET_DICT_0
  120. ]*7
  121. lineage_infos = list(
  122. map(
  123. lambda event: create_lineage_info(event[0], event[1], event[2]),
  124. zip(train_events, eval_events, dataset_events)
  125. )
  126. )
  127. return lineage_infos
  128. LINEAGE_INFO_0 = {
  129. 'summary_dir': '/path/to/summary0',
  130. **event_data.EVENT_TRAIN_DICT_0['train_lineage'],
  131. 'metric': event_data.METRIC_0,
  132. 'valid_dataset': event_data.EVENT_EVAL_DICT_0['evaluation_lineage']['valid_dataset'],
  133. 'dataset_graph': event_data.DATASET_DICT_0
  134. }
  135. LINEAGE_INFO_1 = {
  136. 'summary_dir': '/path/to/summary1',
  137. **event_data.EVENT_TRAIN_DICT_1['train_lineage'],
  138. 'metric': event_data.METRIC_1,
  139. 'valid_dataset': event_data.EVENT_EVAL_DICT_1['evaluation_lineage']['valid_dataset'],
  140. 'dataset_graph': event_data.DATASET_DICT_0
  141. }
  142. LINEAGE_FILTRATION_0 = create_filtration_result(
  143. '/path/to/summary0',
  144. event_data.EVENT_TRAIN_DICT_0,
  145. event_data.EVENT_EVAL_DICT_0,
  146. event_data.METRIC_0,
  147. event_data.DATASET_DICT_0
  148. )
  149. LINEAGE_FILTRATION_1 = create_filtration_result(
  150. '/path/to/summary1',
  151. event_data.EVENT_TRAIN_DICT_1,
  152. event_data.EVENT_EVAL_DICT_1,
  153. event_data.METRIC_1,
  154. event_data.DATASET_DICT_0
  155. )
  156. LINEAGE_FILTRATION_2 = create_filtration_result(
  157. '/path/to/summary2',
  158. event_data.EVENT_TRAIN_DICT_2,
  159. event_data.EVENT_EVAL_DICT_2,
  160. event_data.METRIC_2,
  161. event_data.DATASET_DICT_0
  162. )
  163. LINEAGE_FILTRATION_3 = create_filtration_result(
  164. '/path/to/summary3',
  165. event_data.EVENT_TRAIN_DICT_3,
  166. event_data.EVENT_EVAL_DICT_3,
  167. event_data.METRIC_3,
  168. event_data.DATASET_DICT_0
  169. )
  170. LINEAGE_FILTRATION_4 = create_filtration_result(
  171. '/path/to/summary4',
  172. event_data.EVENT_TRAIN_DICT_4,
  173. event_data.EVENT_EVAL_DICT_4,
  174. event_data.METRIC_4,
  175. event_data.DATASET_DICT_0
  176. )
  177. LINEAGE_FILTRATION_5 = {
  178. "summary_dir": '/path/to/summary5',
  179. "model_lineage": {
  180. "loss_function":
  181. event_data.EVENT_TRAIN_DICT_5['train_lineage']['hyper_parameters']['loss_function'],
  182. "train_dataset_path": None,
  183. "train_dataset_count":
  184. event_data.EVENT_TRAIN_DICT_5['train_lineage']['train_dataset']['train_dataset_size'],
  185. "test_dataset_path": None,
  186. "test_dataset_count": None,
  187. "network": event_data.EVENT_TRAIN_DICT_5['train_lineage']['algorithm']['network'],
  188. "optimizer": event_data.EVENT_TRAIN_DICT_5['train_lineage']['hyper_parameters']['optimizer'],
  189. "learning_rate":
  190. event_data.EVENT_TRAIN_DICT_5['train_lineage']['hyper_parameters']['learning_rate'],
  191. "epoch": event_data.EVENT_TRAIN_DICT_5['train_lineage']['hyper_parameters']['epoch'],
  192. "batch_size": event_data.EVENT_TRAIN_DICT_5['train_lineage']['hyper_parameters']['batch_size'],
  193. "device_num": event_data.EVENT_TRAIN_DICT_5['train_lineage']['hyper_parameters']['device_num'],
  194. "loss": event_data.EVENT_TRAIN_DICT_5['train_lineage']['algorithm']['loss'],
  195. "model_size": event_data.EVENT_TRAIN_DICT_5['train_lineage']['model']['size'],
  196. "metric": {},
  197. "dataset_mark": '2',
  198. "user_defined": {}
  199. },
  200. "dataset_graph": event_data.DATASET_DICT_0
  201. }
  202. LINEAGE_FILTRATION_6 = {
  203. "summary_dir": '/path/to/summary6',
  204. "model_lineage": {
  205. "loss_function": None,
  206. "train_dataset_path": None,
  207. "train_dataset_count": None,
  208. "test_dataset_path":
  209. event_data.EVENT_EVAL_DICT_5['evaluation_lineage']['valid_dataset']['valid_dataset_path'],
  210. "test_dataset_count":
  211. event_data.EVENT_EVAL_DICT_5['evaluation_lineage']['valid_dataset']['valid_dataset_size'],
  212. "network": None,
  213. "optimizer": None,
  214. "learning_rate": None,
  215. "epoch": None,
  216. "batch_size": None,
  217. "device_num": None,
  218. "loss": None,
  219. "model_size": None,
  220. "metric": event_data.METRIC_5,
  221. "dataset_mark": '2',
  222. "user_defined": {}
  223. },
  224. "dataset_graph": event_data.DATASET_DICT_0
  225. }
  226. class TestQuerier(TestCase):
  227. """Test the class of `Querier`."""
  228. @mock.patch('mindinsight.lineagemgr.lineage_parser.SummaryPathParser.get_lineage_summaries')
  229. @mock.patch('mindinsight.lineagemgr.lineage_parser.SummaryWatcher.list_summary_directories')
  230. @mock.patch('mindinsight.lineagemgr.lineage_parser.LineageSummaryAnalyzer.get_user_defined_info')
  231. @mock.patch('mindinsight.lineagemgr.lineage_parser.LineageSummaryAnalyzer.get_summary_infos')
  232. @mock.patch('mindinsight.lineagemgr.lineage_parser.FileHandler')
  233. def setUp(self, mock_file_handler, *args):
  234. """Initialization before test case execution."""
  235. args[0].return_value = create_lineage_info(
  236. event_data.EVENT_TRAIN_DICT_0,
  237. event_data.EVENT_EVAL_DICT_0,
  238. event_data.EVENT_DATASET_DICT_0
  239. )
  240. args[1].return_value = []
  241. args[3].return_value = ['path']
  242. mock_file_handler = MagicMock()
  243. mock_file_handler.size = 1
  244. args[2].return_value = [{'relative_path': './', 'update_time': 1}]
  245. single_summary_path = '/path/to/summary0'
  246. lineage_objects = LineageOrganizer(summary_base_dir=single_summary_path).super_lineage_objs
  247. self.single_querier = Querier(lineage_objects)
  248. lineage_infos = get_lineage_infos()
  249. args[0].side_effect = lineage_infos
  250. summary_base_dir = '/path/to'
  251. relative_dirs = []
  252. for i in range(7):
  253. relative_dirs.append(dict(relative_path=f'./summary{i}', update_time=time.time() - i))
  254. args[2].return_value = relative_dirs
  255. lineage_objects = LineageOrganizer(summary_base_dir=summary_base_dir).super_lineage_objs
  256. self.multi_querier = Querier(lineage_objects)
  257. def test_get_summary_lineage_success_1(self):
  258. """Test the success of get_summary_lineage."""
  259. expected_result = [LINEAGE_INFO_0]
  260. result = self.single_querier.get_summary_lineage()
  261. assert_equal_lineages(expected_result, result, self.assertListEqual)
  262. def test_get_summary_lineage_success_2(self):
  263. """Test the success of get_summary_lineage."""
  264. expected_result = [LINEAGE_INFO_0]
  265. result = self.single_querier.get_summary_lineage()
  266. assert_equal_lineages(expected_result, result, self.assertListEqual)
  267. def test_get_summary_lineage_success_3(self):
  268. """Test the success of get_summary_lineage."""
  269. expected_result = [
  270. {
  271. 'summary_dir': '/path/to/summary0',
  272. 'model': event_data.EVENT_TRAIN_DICT_0['train_lineage']['model'],
  273. 'algorithm': event_data.EVENT_TRAIN_DICT_0['train_lineage']['algorithm']
  274. }
  275. ]
  276. result = self.single_querier.get_summary_lineage(
  277. filter_keys=['model', 'algorithm']
  278. )
  279. assert_equal_lineages(expected_result, result, self.assertListEqual)
  280. def test_get_summary_lineage_success_4(self):
  281. """Test the success of get_summary_lineage."""
  282. expected_result = [
  283. LINEAGE_INFO_0,
  284. LINEAGE_INFO_1,
  285. {
  286. 'summary_dir': '/path/to/summary2',
  287. **event_data.EVENT_TRAIN_DICT_2['train_lineage'],
  288. 'metric': event_data.METRIC_2,
  289. 'valid_dataset': event_data.EVENT_EVAL_DICT_2['evaluation_lineage']['valid_dataset'],
  290. 'dataset_graph': event_data.DATASET_DICT_0
  291. },
  292. {
  293. 'summary_dir': '/path/to/summary3',
  294. **event_data.EVENT_TRAIN_DICT_3['train_lineage'],
  295. 'metric': event_data.METRIC_3,
  296. 'valid_dataset': event_data.EVENT_EVAL_DICT_3['evaluation_lineage']['valid_dataset'],
  297. 'dataset_graph': event_data.DATASET_DICT_0
  298. },
  299. {
  300. 'summary_dir': '/path/to/summary4',
  301. **event_data.EVENT_TRAIN_DICT_4['train_lineage'],
  302. 'metric': event_data.METRIC_4,
  303. 'valid_dataset': event_data.EVENT_EVAL_DICT_4['evaluation_lineage']['valid_dataset'],
  304. 'dataset_graph': event_data.DATASET_DICT_0
  305. },
  306. {
  307. 'summary_dir': '/path/to/summary5',
  308. **event_data.EVENT_TRAIN_DICT_5['train_lineage'],
  309. 'metric': {},
  310. 'valid_dataset': {},
  311. 'dataset_graph': event_data.DATASET_DICT_0
  312. },
  313. {
  314. 'summary_dir': '/path/to/summary6',
  315. 'hyper_parameters': {},
  316. 'algorithm': {},
  317. 'model': {},
  318. 'train_dataset': {},
  319. 'metric': event_data.METRIC_5,
  320. 'valid_dataset': event_data.EVENT_EVAL_DICT_5['evaluation_lineage']['valid_dataset'],
  321. 'dataset_graph': event_data.DATASET_DICT_0
  322. }
  323. ]
  324. result = self.multi_querier.get_summary_lineage()
  325. assert_equal_lineages(expected_result, result, self.assertListEqual)
  326. def test_get_summary_lineage_success_5(self):
  327. """Test the success of get_summary_lineage."""
  328. expected_result = [LINEAGE_INFO_1]
  329. result = self.multi_querier.get_summary_lineage(
  330. summary_dir='/path/to/summary1'
  331. )
  332. assert_equal_lineages(expected_result, result, self.assertListEqual)
  333. def test_get_summary_lineage_success_6(self):
  334. """Test the success of get_summary_lineage."""
  335. expected_result = [
  336. {
  337. 'summary_dir': '/path/to/summary0',
  338. 'hyper_parameters': event_data.EVENT_TRAIN_DICT_0['train_lineage']['hyper_parameters'],
  339. 'train_dataset': event_data.EVENT_TRAIN_DICT_0['train_lineage']['train_dataset'],
  340. 'metric': event_data.METRIC_0,
  341. 'valid_dataset': event_data.EVENT_EVAL_DICT_0['evaluation_lineage']['valid_dataset']
  342. }
  343. ]
  344. filter_keys = [
  345. 'metric', 'hyper_parameters', 'train_dataset', 'valid_dataset'
  346. ]
  347. result = self.multi_querier.get_summary_lineage(
  348. summary_dir='/path/to/summary0', filter_keys=filter_keys
  349. )
  350. assert_equal_lineages(expected_result, result, self.assertListEqual)
  351. def test_get_summary_lineage_fail(self):
  352. """Test the function of get_summary_lineage with exception."""
  353. filter_keys = ['xxx']
  354. self.assertRaises(
  355. LineageQuerierParamException,
  356. self.multi_querier.get_summary_lineage,
  357. filter_keys=filter_keys
  358. )
  359. self.assertRaises(
  360. LineageQuerierParamException,
  361. self.multi_querier.get_summary_lineage,
  362. summary_dir='xxx'
  363. )
  364. def test_filter_summary_lineage_success_1(self):
  365. """Test the success of filter_summary_lineage."""
  366. condition = {
  367. 'optimizer': {
  368. 'in': [
  369. 'ApplyMomentum0',
  370. 'ApplyMomentum1',
  371. 'ApplyMomentum2',
  372. 'ApplyMomentum4'
  373. ]
  374. },
  375. 'learning_rate': {
  376. 'lt': 0.5,
  377. 'gt': 0.2
  378. },
  379. 'sorted_name': 'summary_dir'
  380. }
  381. expected_result = {
  382. 'customized': event_data.CUSTOMIZED_0,
  383. 'object': [
  384. LINEAGE_FILTRATION_1,
  385. LINEAGE_FILTRATION_2
  386. ],
  387. 'count': 2,
  388. }
  389. result = self.multi_querier.filter_summary_lineage(condition=condition)
  390. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  391. def test_filter_summary_lineage_success_2(self):
  392. """Test the success of filter_summary_lineage."""
  393. condition = {
  394. 'batch_size': {
  395. 'le': 50,
  396. 'ge': 35
  397. },
  398. 'model_size': {
  399. 'lt': 400716934,
  400. 'gt': 400716931
  401. },
  402. 'sorted_name': 'batch_size',
  403. 'sorted_type': 'descending'
  404. }
  405. expected_result = {
  406. 'customized': event_data.CUSTOMIZED_0,
  407. 'object': [
  408. LINEAGE_FILTRATION_2,
  409. LINEAGE_FILTRATION_3
  410. ],
  411. 'count': 2,
  412. }
  413. result = self.multi_querier.filter_summary_lineage(condition=condition)
  414. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  415. def test_filter_summary_lineage_success_3(self):
  416. """Test the success of filter_summary_lineage."""
  417. condition = {
  418. 'limit': 2,
  419. 'offset': 1
  420. }
  421. expected_result = {
  422. 'customized': event_data.CUSTOMIZED_0,
  423. 'object': [
  424. LINEAGE_FILTRATION_2,
  425. LINEAGE_FILTRATION_3
  426. ],
  427. 'count': 7,
  428. }
  429. result = self.multi_querier.filter_summary_lineage(condition=condition)
  430. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  431. def test_filter_summary_lineage_success_4(self):
  432. """Test the success of filter_summary_lineage."""
  433. expected_result = {
  434. 'customized': event_data.CUSTOMIZED_2,
  435. 'object': [
  436. LINEAGE_FILTRATION_0,
  437. LINEAGE_FILTRATION_1,
  438. LINEAGE_FILTRATION_2,
  439. LINEAGE_FILTRATION_3,
  440. LINEAGE_FILTRATION_4,
  441. LINEAGE_FILTRATION_5,
  442. LINEAGE_FILTRATION_6
  443. ],
  444. 'count': 7,
  445. }
  446. result = self.multi_querier.filter_summary_lineage()
  447. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  448. def test_filter_summary_lineage_success_5(self):
  449. """Test the success of filter_summary_lineage."""
  450. condition = {
  451. 'optimizer': {
  452. 'eq': 'ApplyMomentum4'
  453. }
  454. }
  455. expected_result = {
  456. 'customized': event_data.CUSTOMIZED_0,
  457. 'object': [LINEAGE_FILTRATION_4],
  458. 'count': 1,
  459. }
  460. result = self.multi_querier.filter_summary_lineage(condition=condition)
  461. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  462. def test_filter_summary_lineage_success_6(self):
  463. """Test the success of filter_summary_lineage."""
  464. condition = {
  465. 'sorted_name': 'metric/accuracy',
  466. 'sorted_type': 'ascending'
  467. }
  468. expected_result = {
  469. 'customized': event_data.CUSTOMIZED_2,
  470. 'object': [
  471. LINEAGE_FILTRATION_0,
  472. LINEAGE_FILTRATION_5,
  473. LINEAGE_FILTRATION_1,
  474. LINEAGE_FILTRATION_2,
  475. LINEAGE_FILTRATION_3,
  476. LINEAGE_FILTRATION_4,
  477. LINEAGE_FILTRATION_6
  478. ],
  479. 'count': 7,
  480. }
  481. result = self.multi_querier.filter_summary_lineage(condition=condition)
  482. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  483. def test_filter_summary_lineage_success_7(self):
  484. """Test the success of filter_summary_lineage."""
  485. condition = {
  486. 'sorted_name': 'metric/accuracy',
  487. 'sorted_type': 'descending'
  488. }
  489. expected_result = {
  490. 'customized': event_data.CUSTOMIZED_2,
  491. 'object': [
  492. LINEAGE_FILTRATION_6,
  493. LINEAGE_FILTRATION_4,
  494. LINEAGE_FILTRATION_3,
  495. LINEAGE_FILTRATION_2,
  496. LINEAGE_FILTRATION_1,
  497. LINEAGE_FILTRATION_0,
  498. LINEAGE_FILTRATION_5
  499. ],
  500. 'count': 7,
  501. }
  502. result = self.multi_querier.filter_summary_lineage(condition=condition)
  503. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  504. def test_filter_summary_lineage_success_8(self):
  505. """Test the success of filter_summary_lineage."""
  506. condition = {
  507. 'metric/accuracy': {
  508. 'lt': 1.6000006,
  509. 'gt': 1.4000004
  510. }
  511. }
  512. expected_result = {
  513. 'customized': event_data.CUSTOMIZED_0,
  514. 'object': [LINEAGE_FILTRATION_4],
  515. 'count': 1,
  516. }
  517. result = self.multi_querier.filter_summary_lineage(condition=condition)
  518. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  519. def test_filter_summary_lineage_success_9(self):
  520. """Test the success of filter_summary_lineage."""
  521. condition = {
  522. 'limit': 3,
  523. 'offset': 3
  524. }
  525. expected_result = {
  526. 'customized': {},
  527. 'object': [],
  528. 'count': 7,
  529. }
  530. result = self.multi_querier.filter_summary_lineage(condition=condition)
  531. assert_equal_lineages(expected_result, result, self.assertDictEqual)
  532. def test_filter_summary_lineage_fail(self):
  533. """Test the function of filter_summary_lineage with exception."""
  534. condition = {
  535. 'xxx': {
  536. 'lt': 1.6000006,
  537. 'gt': 1.4000004
  538. }
  539. }
  540. self.assertRaises(
  541. LineageQuerierParamException,
  542. self.multi_querier.filter_summary_lineage,
  543. condition=condition
  544. )
  545. condition = {
  546. 'accuracy': {
  547. 'xxx': 1
  548. }
  549. }
  550. self.assertRaises(
  551. LineageQuerierParamException,
  552. self.multi_querier.filter_summary_lineage,
  553. condition=condition
  554. )
  555. condition = {
  556. 'sorted_name': 'xxx'
  557. }
  558. self.assertRaises(
  559. LineageQuerierParamException,
  560. self.multi_querier.filter_summary_lineage,
  561. condition=condition
  562. )
  563. def test_init_fail(self):
  564. """Test the function of init with exception."""
  565. obj_dict = 'a'
  566. with self.assertRaises(LineageParamTypeError):
  567. Querier(obj_dict)
  568. obj_dict = None
  569. with self.assertRaises(LineageQuerierParamException):
  570. Querier(obj_dict)