示例#1
0
            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);
            }
示例#2
0
            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);
            }
示例#3
0
            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);
            }
示例#4
0
            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));
            }
示例#5
0
 public SequenceSize Add(SequenceSize size)
 {
     return(new SequenceSize(Bytes + size.Bytes, Elements + size.Elements));
 }
示例#6
0
            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);
            }