@@ -75,26 +75,39 @@ create or replace type body ut_be_within as
7575 l_result.expected := ut_data_value_date(a_expected);
7676 return l_result;
7777 end;
78-
78+
7979 overriding member function run_matcher(self in out nocopy ut_be_within, a_actual ut_data_value) return boolean is
8080 l_result boolean;
81+ function l_result_from_number return boolean is
82+ l_expected number := treat(self.expected as ut_data_value_number).data_value;
83+ l_actual number := treat(a_actual as ut_data_value_number).data_value;
84+ l_distance number := treat(self.distance_from_expected as ut_data_value_number).data_value;
85+ begin
86+ return abs(l_expected - l_actual) <= l_distance;
87+ end;
88+
89+ function l_result_from_date(a_distance ut_data_value) return boolean is
90+ l_expected date := treat(self.expected as ut_data_value_date).data_value;
91+ l_actual date := treat(a_actual as ut_data_value_date).data_value;
92+ l_distance_ym yminterval_unconstrained := case when self.distance_from_expected is of ( ut_data_value_yminterval)
93+ then treat(self.distance_from_expected as ut_data_value_yminterval).data_value
94+ end;
95+ l_distance_ds dsinterval_unconstrained := case when self.distance_from_expected is of ( ut_data_value_dsinterval)
96+ then treat(self.distance_from_expected as ut_data_value_dsinterval).data_value
97+ end;
98+ begin
99+ return case when l_distance_ym is not null
100+ then l_actual between l_expected - l_distance_ym and l_expected + l_distance_ym
101+ else l_actual between l_expected - l_distance_ds and l_expected + l_distance_ds
102+ end;
103+ end;
104+
81105 begin
82106 if self.expected.data_type = a_actual.data_type then
83107 if self.expected is of (ut_data_value_number) then
84- l_result := abs((treat(self.expected as ut_data_value_number).data_value - treat(a_actual as ut_data_value_number).data_value)) <=
85- treat(self.distance_from_expected as ut_data_value_number).data_value;
86- elsif self.expected is of (ut_data_value_date) and self.distance_from_expected is of ( ut_data_value_yminterval) then
87- l_result := treat(a_actual as ut_data_value_date).data_value
88- between
89- (treat(self.expected as ut_data_value_date).data_value) - treat(self.distance_from_expected as ut_data_value_yminterval).data_value
90- and
91- (treat(self.expected as ut_data_value_date).data_value) + treat(self.distance_from_expected as ut_data_value_yminterval).data_value;
92- elsif self.expected is of (ut_data_value_date) and self.distance_from_expected is of ( ut_data_value_dsinterval) then
93- l_result := treat(a_actual as ut_data_value_date).data_value
94- between
95- (treat(self.expected as ut_data_value_date).data_value) - treat(self.distance_from_expected as ut_data_value_dsinterval).data_value
96- and
97- (treat(self.expected as ut_data_value_date).data_value) + treat(self.distance_from_expected as ut_data_value_dsinterval).data_value;
108+ l_result := l_result_from_number;
109+ elsif self.expected is of (ut_data_value_date)then
110+ l_result := l_result_from_date(self.distance_from_expected);
98111 end if;
99112 else
100113 l_result := (self as ut_matcher).run_matcher(a_actual);
0 commit comments