Consider length for valid Integer range
Closed this issue · 2 comments
Goal: the range derived from a possible length becomes part of the rule for considering the range in IntegerFieldFormat
:
length rule actual rule
-2147483648...2147483647
1...99 1...99
4 -999...9999
4 1...99 1..99
2 1...999 length_range = Range('-9..99')
rule_range = Range('1...999')
if length_range.upper < rule_range.upper --> error
if length_range.lower > rule_range.lower --> error
There is a code segment in cid.py
to validate the field length for fixed format data,
which probably can be simplified once Range
supports an upper
and lower
property.
In particular the variable field_length_is_broken
seems bogus.
# Validate field length for fixed format.
if self._data_format.format == data.FORMAT_FIXED:
self._location.set_cell(4)
if field_format.length.items:
field_length_is_broken = True
if len(field_format.length.items) == 1:
(lower, upper) = field_format.length.items[0]
if lower == upper:
if lower < 1:
raise errors.InterfaceError(
"length of field %r for fixed data format must be at least 1 but is: %s"
% (field_name, field_format.length), self._location)
field_length_is_broken = False
if field_length_is_broken:
raise errors.InterfaceError(
"length of field %r for fixed data format must be a single value but is: %s"
% (field_name, field_format.length), self._location)
else:
raise errors.InterfaceError(
"length of field %r must be specified with fixed data format" % field_name, self._location)
@butterhirsch: I noticed that the initial implementation did not point out inconsistencies concerning the lower limit of a range, for example: length='3', rule='1234...'
During fixing this I changed the consistency check to simply traverse the lower and upper limits of the rule and check the character length of each of them. Therefore the derived length_range is not needed anymore. Also any errors detected by validating against the length range are already detected by validating against the length before, so currently IntergerFieldFormat
has no use whatsoever for the derived length range. So I suppose we can remove it.
Nevertheless there still is a use for ranges.create_range_from_length()
to derive a SQL constraint for integer fields with a length but without a rule.