001// Licensed under the MIT license. See LICENSE file in the project root for full license information.
002
003package de.bytefish.pgbulkinsert.pgsql.handlers;
004
005import de.bytefish.pgbulkinsert.pgsql.model.range.Range;
006
007import java.io.DataOutputStream;
008
009public class RangeValueHandler<TElementType> extends BaseValueHandler<Range<TElementType>> {
010
011    private final IValueHandler<TElementType> valueHandler;
012
013    public RangeValueHandler(IValueHandler<TElementType> valueHandler) {
014        this.valueHandler = valueHandler;
015    }
016
017    @SuppressWarnings("NullAway") // infinite bound checks only pass when bound value is not null
018    @Override
019    protected void internalHandle(DataOutputStream buffer, Range<TElementType> value) throws Exception {
020        buffer.writeInt(getLength(value));
021        buffer.writeByte(value.getFlags());
022
023        if (value.isEmpty()) {
024            return;
025        }
026
027        if(!value.isLowerBoundInfinite()) {
028            valueHandler.handle(buffer, value.getLowerBound());
029        }
030
031        if(!value.isUpperBoundInfinite()) {
032            valueHandler.handle(buffer, value.getUpperBound());
033        }
034    }
035
036    @SuppressWarnings("NullAway") // infinite bound checks only pass when bound value is not null
037    @Override
038    public int getLength(Range<TElementType> value) {
039        int totalLen = 1;
040
041        if (!value.isEmpty()) {
042            if (!value.isLowerBoundInfinite()) {
043                totalLen += 4 + valueHandler.getLength(value.getLowerBound());
044            }
045
046            if (!value.isUpperBoundInfinite()) {
047                totalLen += 4 + valueHandler.getLength(value.getUpperBound());
048            }
049        }
050
051        return totalLen;
052    }
053}
054