On 03/07/2021 21:13, Adrian Klaver wrote:
> On 7/3/21 12:16 PM, Ray O'Donnell wrote:
>> Yes, you're right - I realised that after I sent my last email. The
>> inner loop in the function should have matched overlapping bookings by
>> aircraft registration:
>>
>> -- For each booking, check whether there are any with
>> -- a higher priority and whose times overlap it.
>> for m_overlapping in
>> select booking_id, booking_time from bookings
>> where booking_id < m_rec.booking_id
>> and booking_time && m_rec.booking_time
>> loop
>> -- Snip away any overlapping (obscured) time.
>> m_visible_time := m_visible_time - m_overlapping.booking_time;
>> end loop;
>
> Was the above supposed to show the change?
Whoops, sorry, here it is:
for m_overlapping_time in
select booking_id, booking_time from bookings
where aircraft_reg = m_rec.aircraft_reg
and booking_id < m_rec.booking_id
and booking_time && m_rec.booking_time
loop
[... etc ...]
>> select booking_id, aircraft_reg, booking_time from bookings order by
>> aircraft_reg, lower(booking_time);
>>
>
> Pretty sure lower() is not needed, if I'm following this correctly:
>
> https://www.postgresql.org/docs/12/functions-range.html
>
> "The simple comparison operators <, >, <=, and >= compare the lower
> bounds first, and only if those are equal, compare the upper bounds.
> These comparisons are not usually very useful for ranges, but are
> provided to allow B-tree indexes to be constructed on ranges."
Ah, good - thanks for pointing that out.
> In the case where the lower bound is the same I'm thinking using
> lower() will result in different ordering under different circumstances:
I see what you mean. It shouldn't matter for our use case; ordering on
the aircraft registration and time is what counts for us, and the output
of the function ought to produce well-ordered booking times for each
aircraft. The other columns are used for display purposes only.
>> I need to play with it a bit more: for example, if a long,
>> lower-priority booking is behind a short, higher-priority one such
>> that the long one extends both before and after the short one, then
>> the range-difference operator will give me an error about a
>> non-contiguous result. However, I think I'm heading in the right
>> direction now.
>
> Great. Good luck going forward.
Thanks again for your help - much appreciated!
Ray.
--
Raymond O'Donnell // Galway // Ireland
ray@rodonnell.ie