public SequenceSize SkipNext(ReadOnlySequence <byte> sequence, int maxElementsCount) { var result = new SequenceSize(0, 0); if (_basePosition < _baseRowCount) { var baseResult = _baseReader.Skip(sequence, _baseRowCount - _basePosition, ref _baseSkipContext); _basePosition += baseResult.Elements; result = result.AddBytes(baseResult.Bytes); if (_basePosition < _baseRowCount) { return(result); } } if (!_headerSkipped) { if (sequence.Length - result.Bytes < sizeof(ulong)) { return(result); } result = result.AddBytes(sizeof(ulong)); _headerSkipped = true; } var elementCount = Math.Min(((int)sequence.Length - result.Bytes) / _keySize, maxElementsCount); result += new SequenceSize(elementCount * _keySize, elementCount); return(result); }
public SequenceSize Skip(ReadOnlySequence <byte> sequence, int maxElementsCount, ref object?skipContext) { var slice = sequence; var result = new SequenceSize(0, 0); LowCardinalityColumnReaderSkipContext knownSkipContext; if (skipContext == null) { var header = TryReadHeader(slice); if (header == null) { return(result); } result = result.AddBytes(header.Value.bytesRead); slice = slice.Slice(header.Value.bytesRead); var baseReader = _baseType.CreateColumnReader(0); skipContext = knownSkipContext = new LowCardinalityColumnReaderSkipContext(baseReader, header.Value.keyCount, header.Value.keySize); } else { knownSkipContext = (LowCardinalityColumnReaderSkipContext)skipContext; } result += knownSkipContext.SkipNext(slice, maxElementsCount); return(result); }
public SequenceSize ReadNext(ReadOnlySequence <byte> sequence) { if (_position >= _rowCount) { throw new ClickHouseException(ClickHouseErrorCodes.DataReaderError, "Internal error. Attempt to read after the end of the column."); } var result = new SequenceSize(0, 0); var slice = sequence; if (_baseColumnReader == null) { var header = TryReadHeader(slice); if (header == null) { return(result); } _baseRowCount = header.Value.keyCount; _keySize = header.Value.keySize; _baseColumnReader = _baseType.CreateColumnReader(_baseRowCount); slice = slice.Slice(header.Value.bytesRead); result = result.AddBytes(header.Value.bytesRead); } if (_baseRowCount > 0) { var baseResult = _baseColumnReader.ReadNext(slice); _baseRowCount -= baseResult.Elements; slice = slice.Slice(baseResult.Bytes); result = result.AddBytes(baseResult.Bytes); } if (_baseRowCount > 0) { return(result); } if (_buffer == null) { if (slice.Length < sizeof(ulong)) { return(result); } ulong length = 0; slice.Slice(0, sizeof(ulong)).CopyTo(MemoryMarshal.AsBytes(MemoryMarshal.CreateSpan(ref length, 1))); if ((int)length != _rowCount) { throw new ClickHouseException(ClickHouseErrorCodes.DataReaderError, $"Internal error. Row count check failed: {_rowCount} rows expected, {length} rows detected."); } _buffer = new byte[_rowCount * _keySize]; slice = slice.Slice(sizeof(ulong)); result = result.AddBytes(sizeof(ulong)); } var elementCount = Math.Min(_rowCount - _position, (int)(slice.Length / _keySize)); var byteCount = elementCount * _keySize; slice.Slice(0, byteCount).CopyTo(new Span <byte>(_buffer, _position * _keySize, byteCount)); _position += elementCount; result += new SequenceSize(byteCount, elementCount); return(result); }
public SequenceSize ReadNext(ReadOnlySequence <byte> sequence) { if (_position >= _rowCount) { throw new ClickHouseException(ClickHouseErrorCodes.DataReaderError, "Internal error. Attempt to read after the end of the column."); } int bytesCount = 0; var slice = sequence; if (_elementColumnReader == null) { var totalLength = _ranges.Aggregate((ulong)0, (acc, r) => acc + (ulong)r.length); Span <byte> sizeSpan = stackalloc byte[sizeof(ulong)]; for (int i = _ranges.Count; i < _rowCount; i++) { if (slice.Length < sizeSpan.Length) { return(new SequenceSize(bytesCount, 0)); } ulong length; if (slice.FirstSpan.Length >= sizeSpan.Length) { length = BitConverter.ToUInt64(slice.FirstSpan); } else { slice.Slice(0, sizeSpan.Length).CopyTo(sizeSpan); length = BitConverter.ToUInt64(sizeSpan); } slice = slice.Slice(sizeSpan.Length); bytesCount += sizeSpan.Length; var offset = checked ((int)totalLength); var rangeLength = checked ((int)(length - totalLength)); _ranges.Add((offset, rangeLength)); totalLength = length; } _elementColumnReader = _elementType.CreateColumnReader(checked ((int)totalLength)); if (totalLength == 0) { // Special case for an empty array var result = new SequenceSize(bytesCount, _rowCount - _position); _position = _rowCount; return(result); } } var elementsSize = _elementColumnReader.ReadNext(slice); _elementPosition += elementsSize.Elements; var elementsCount = 0; while (_position < _rowCount) { var currentRange = _ranges[_position]; if (currentRange.length + currentRange.offset > _elementPosition) { break; } ++elementsCount; ++_position; } return(new SequenceSize(bytesCount + elementsSize.Bytes, elementsCount)); }
public SequenceSize Add(SequenceSize size) { return(new SequenceSize(Bytes + size.Bytes, Elements + size.Elements)); }
public SequenceSize ReadNext(ReadOnlySequence <byte> sequence) { var slice = sequence; var result = new SequenceSize(0, 0); if (_baseReader == null) { var header = LowCardinalityColumnReader.TryReadHeader(slice); if (header == null) { return(result); } result = result.AddBytes(header.Value.bytesRead); slice = slice.Slice(header.Value.bytesRead); _baseRowCount = header.Value.keyCount; _keySize = header.Value.keySize; _baseReader = _baseType.CreateSkippingColumnReader(_baseRowCount); } if (_basePosition < _baseRowCount) { var baseResult = _baseReader.ReadNext(slice); _basePosition += baseResult.Elements; result = result.AddBytes(baseResult.Bytes); if (_basePosition < _baseRowCount) { return(result); } } if (!_headerSkipped) { if (sequence.Length - result.Bytes < sizeof(ulong)) { return(result); } ulong length = 0; sequence.Slice(result.Bytes, sizeof(ulong)).CopyTo(MemoryMarshal.AsBytes(MemoryMarshal.CreateSpan(ref length, 1))); if ((int)length != _rowCount) { throw new ClickHouseException(ClickHouseErrorCodes.DataReaderError, $"Internal error. Row count check failed: {_rowCount} rows expected, {length} rows detected."); } result = result.AddBytes(sizeof(ulong)); _headerSkipped = true; } var maxElementsCount = _rowCount - _position; if (maxElementsCount <= 0) { throw new ClickHouseException(ClickHouseErrorCodes.DataReaderError, "Internal error. Attempt to read after the end of the column."); } var elementCount = (int)Math.Min((sequence.Length - result.Bytes) / _keySize, maxElementsCount); _position += elementCount; result += new SequenceSize(elementCount * _keySize, elementCount); return(result); }