Passed
Push — master ( b79fc0...0894ce )
by Daniel
01:13
created

ParameterHandling.build_parameters()   A

Complexity

Conditions 3

Size

Total Lines 13
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 12
nop 4
dl 0
loc 13
rs 9.8
c 0
b 0
f 0
1
"""
2
Class Parameter Handling
3
4
Facilitates handling parameters values
5
"""
6
# package to handle dates and times
7
from datetime import datetime as ClassDT
8
from datetime import timedelta
9
# package to facilitate common operations
10
from db_extractor.BasicNeeds import BasicNeeds
11
# package to facilitate regular expressions
12
import re
13
14
15
class ParameterHandling:
16
    lcl_bn = None
17
18
    def __init__(self):
19
        self.lcl_bn = BasicNeeds()
20
21
    def build_parameters(self, local_logger, query_session_parameters, in_parameter_rules):
22
        local_logger.debug('Seen Parameters are: ' + str(query_session_parameters))
23
        parameters_type = type(query_session_parameters)
24
        local_logger.debug('Parameters type is ' + str(parameters_type))
25
        if str(parameters_type) == "<class 'dict'>":
26
            tp = tuple(query_session_parameters.values())
27
        elif str(parameters_type) == "<class 'list'>":
28
            tp = tuple(query_session_parameters)
29
        else:
30
            local_logger.error('Unknown parameter type (expected either Dictionary or List)')
31
            exit(1)
32
        local_logger.debug('Initial Tuple for Parameters is: ' + str(tp))
0 ignored issues
show
introduced by
The variable tp does not seem to be defined for all execution paths.
Loading history...
33
        return self.stringify_parameters(local_logger, tp, in_parameter_rules)
34
35
    def calculate_date_from_expression(self, local_logger, expression_parts):
36
        final_string = ''
37
        current_date = ClassDT.today()
38
        if expression_parts[1] == 'CYCW':
39
            if len(expression_parts) >= 3:
40
                current_date = current_date + timedelta(weeks=int(expression_parts[2]))
41
            week_iso_num = ClassDT.isocalendar(current_date)[1]
42
            final_string = str(ClassDT.isocalendar(current_date)[0])\
43
                           + self.lcl_bn.fn_numbers_with_leading_zero(str(week_iso_num), 2)
44
        else:
45
            local_logger.error('Unknown expression encountered '
46
                               + str(expression_parts[1]) + '...')
47
            exit(1)
48
        return final_string
49
50
    def handle_query_parameters(self, local_logger, given_session):
51
        tp = None
52
        if 'parameters' in given_session:
53
            parameter_rules = []
54
            if 'parameters-handling-rules' in given_session:
55
                parameter_rules = given_session['parameters-handling-rules']
56
            tp = self.build_parameters(local_logger, given_session['parameters'], parameter_rules)
57
        return tp
58
59
    @staticmethod
60
    def manage_parameter_value(given_prefix, given_parameter, given_parameter_rules):
61
        element_to_join = ''
62
        if given_prefix == 'dict':
63
            element_to_join = given_parameter.values()
64
        elif given_prefix == 'list':
65
            element_to_join = given_parameter
66
        return given_parameter_rules[given_prefix + '-values-prefix'] \
67
               + given_parameter_rules[given_prefix + '-values-glue'].join(element_to_join) \
68
               + given_parameter_rules[given_prefix + '-values-suffix']
69
70
    def simulate_final_query(self, local_logger, timered, in_query, in_parameters_number, in_tp):
71
        timered.start()
72
        return_query = in_query
73
        if in_parameters_number > 0:
74
            try:
75
                return_query = in_query % in_tp
76
                local_logger.info('Query with parameters interpreted is: '
77
                                  + self.lcl_bn.fn_multi_line_string_to_single_line(return_query))
78
            except TypeError as e:
79
                local_logger.debug('Initial query expects ' + str(in_parameters_number)
80
                                   + ' parameters but only ' + str(len(in_tp))
81
                                   + ' parameters were provided!')
82
                local_logger.error(e)
83
        timered.stop()
84
85
    def special_case_string(self, local_logger, crt_parameter):
86
        resulted_parameter_value = crt_parameter
87
        matching_rule = re.search(r'(CalculatedDate\_[A-Z]{4}\_(-*)[0-9]{1,2})', crt_parameter)
88
        if matching_rule:
89
            parameter_value_parts = matching_rule.group().split('_')
90
            calculated_parameter_value = self.calculate_date_from_expression(local_logger,
91
                                                                             parameter_value_parts)
92
            resulted_parameter_value = re.sub(matching_rule.group(), calculated_parameter_value,
93
                                              crt_parameter)
94
            local_logger.debug('Current Parameter is STR '
95
                               + 'and has been re-interpreted as value: '
96
                               + str(resulted_parameter_value))
97
        return resulted_parameter_value
98
99
    def stringify_parameters(self, local_logger, tuple_parameters, given_parameter_rules):
100
        working_list = []
101
        for ndx, crt_parameter in enumerate(tuple_parameters):
102
            current_parameter_type = str(type(crt_parameter))
103
            working_list.append(ndx)
104
            if current_parameter_type == "<class 'str'>":
105
                local_logger.debug('Current Parameter is STR and has the value: ' + crt_parameter)
106
                working_list[ndx] = self.special_case_string(local_logger, crt_parameter)
107
            elif current_parameter_type in ("<class 'list'>", "<class 'dict'>"):
108
                prefix = current_parameter_type.replace("<class '", '').replace("'>", '')
109
                local_logger.debug('Current Parameter is ' + prefix.upper()
110
                                   + ' and has the value: ' + str(crt_parameter))
111
                working_list[ndx] = self.manage_parameter_value(prefix.lower(), crt_parameter,
112
                                                                given_parameter_rules)
113
        final_tuple = tuple(working_list)
114
        local_logger.debug('Final Tuple for Parameters is: ' + str(final_tuple))
115
        return final_tuple
116