1 | #include "ConfigPreprocessor.h" |
2 | #include <Core/Types.h> |
3 | #include <Poco/Path.h> |
4 | #include <regex> |
5 | namespace DB |
6 | { |
7 | std::vector<XMLConfigurationPtr> ConfigPreprocessor::processConfig( |
8 | const Strings & tests_tags, |
9 | const Strings & tests_names, |
10 | const Strings & tests_names_regexp, |
11 | const Strings & skip_tags, |
12 | const Strings & skip_names, |
13 | const Strings & skip_names_regexp) const |
14 | { |
15 | |
16 | std::vector<XMLConfigurationPtr> result; |
17 | for (const auto & path_str : paths) |
18 | { |
19 | auto test = XMLConfigurationPtr(new XMLConfiguration(path_str)); |
20 | result.push_back(test); |
21 | |
22 | const auto path = Poco::Path(path_str); |
23 | test->setString("path" , path.absolute().toString()); |
24 | if (test->getString("name" , "" ) == "" ) |
25 | test->setString("name" , path.getBaseName()); |
26 | } |
27 | |
28 | /// Leave tests: |
29 | removeConfigurationsIf(result, FilterType::Tag, tests_tags, true); |
30 | removeConfigurationsIf(result, FilterType::Name, tests_names, true); |
31 | removeConfigurationsIf(result, FilterType::Name_regexp, tests_names_regexp, true); |
32 | |
33 | /// Skip tests |
34 | removeConfigurationsIf(result, FilterType::Tag, skip_tags, false); |
35 | removeConfigurationsIf(result, FilterType::Name, skip_names, false); |
36 | removeConfigurationsIf(result, FilterType::Name_regexp, skip_names_regexp, false); |
37 | return result; |
38 | } |
39 | |
40 | void ConfigPreprocessor::removeConfigurationsIf( |
41 | std::vector<XMLConfigurationPtr> & configs, |
42 | ConfigPreprocessor::FilterType filter_type, |
43 | const Strings & values, |
44 | bool leave) const |
45 | { |
46 | auto checker = [&filter_type, &values, &leave] (XMLConfigurationPtr & config) |
47 | { |
48 | if (values.size() == 0) |
49 | return false; |
50 | |
51 | bool remove_or_not = false; |
52 | |
53 | if (filter_type == FilterType::Tag) |
54 | { |
55 | Strings tags_keys; |
56 | config->keys("tags" , tags_keys); |
57 | |
58 | Strings tags(tags_keys.size()); |
59 | for (size_t i = 0; i != tags_keys.size(); ++i) |
60 | tags[i] = config->getString("tags.tag[" + std::to_string(i) + "]" ); |
61 | |
62 | for (const std::string & config_tag : tags) |
63 | { |
64 | if (std::find(values.begin(), values.end(), config_tag) != values.end()) |
65 | remove_or_not = true; |
66 | } |
67 | } |
68 | |
69 | if (filter_type == FilterType::Name) |
70 | { |
71 | remove_or_not = (std::find(values.begin(), values.end(), config->getString("name" , "" )) != values.end()); |
72 | } |
73 | |
74 | if (filter_type == FilterType::Name_regexp) |
75 | { |
76 | std::string config_name = config->getString("name" , "" ); |
77 | auto regex_checker = [&config_name](const std::string & name_regexp) |
78 | { |
79 | std::regex pattern(name_regexp); |
80 | return std::regex_search(config_name, pattern); |
81 | }; |
82 | |
83 | remove_or_not = config->has("name" ) ? (std::find_if(values.begin(), values.end(), regex_checker) != values.end()) : false; |
84 | } |
85 | |
86 | if (leave) |
87 | remove_or_not = !remove_or_not; |
88 | return remove_or_not; |
89 | }; |
90 | |
91 | auto new_end = std::remove_if(configs.begin(), configs.end(), checker); |
92 | configs.erase(new_end, configs.end()); |
93 | } |
94 | |
95 | } |
96 | |