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