Example #1
0
 public ReaderEnumerator(IPersistentStorage storage, PostingListAddress address)
 {
     this.persistentStorage = storage;
     this.address           = address;
     this.buffer            = new byte[ReadBufferSize];
     this.selectors         = new int[4];
     this.data      = null;
     this.dataIndex = 0;
     Reset();
 }
Example #2
0
            private int NextInteger()
            {
                if (data == null || dataIndex >= data.Length)
                {
                    data      = ReadPacked();
                    dataIndex = 0;
                }

                return(data.Get(dataIndex++));
            }
Example #3
0
 public void Reset()
 {
     state              = 0;
     dataInBuffer       = 0;
     indxInBuffer       = 0;
     readOffset         = address.Offset;
     isEof              = false;
     listEndOffset      = 0;
     continuationOffset = 0;
     data      = null;
     dataIndex = 0;
 }
Example #4
0
            public bool MoveNext()
            {
                while (true)
                {
                    if (state == 0)
                    {
                        if (continuationOffset > 0)
                        {
                            readOffset   = continuationOffset;
                            isEof        = false;
                            dataInBuffer = 0;
                            indxInBuffer = 0;
                        }

                        if (isEof)
                        {
                            return(false);
                        }

                        var headerBuffer = new byte[HeaderLength];
                        persistentStorage.ReadAll(readOffset, headerBuffer, 0, headerBuffer.Length);

                        continuationOffset = BitConverter.ToInt64(headerBuffer, 0);
                        listEndOffset      = readOffset + HeaderLength + BitConverter.ToInt32(headerBuffer, sizeof(long));

                        readOffset += headerBuffer.Length;
                        state       = 1;
                        data        = null;
                        dataIndex   = 0;
                    }

                    if (state == 1)
                    {
                        current = Occurrence.O((ulong)NextInteger(),
                                               (ulong)NextInteger(),
                                               (ulong)NextInteger());
                        state = 2;
                        return(true);
                    }

                    if (state == 2)
                    {
                        if (isEof && indxInBuffer >= dataInBuffer && (data == null || dataIndex >= data.Length))
                        {
                            state = 0;
                        }
                        else
                        {
                            deltaSelector = (uint)NextInteger();

                            if (deltaSelector == 0)
                            {
                                state = 0;
                            }
                            else
                            {
                                state = 3;
                            }
                        }
                    }

                    if (state == 3)
                    {
                        int delta = (int)(deltaSelector & 0b00000011);
                        deltaSelector >>= 2;

                        switch (delta)
                        {
                        case 0:
                        {
                            throw new Exception("Zero delta is not used, see comments in DeltaWriter");
                        }

                        case 1:
                        {
                            var deltaToken = (ulong)NextInteger();
                            current = Occurrence.O(current.DocumentId,
                                                   current.FieldId,
                                                   current.TokenId + deltaToken);
                            break;
                        }

                        case 2:
                        {
                            var deltaFieldId = (ulong)NextInteger();
                            var token        = (ulong)NextInteger();
                            current = Occurrence.O(current.DocumentId,
                                                   current.FieldId + deltaFieldId,
                                                   token);
                            break;
                        }

                        case 3:
                        {
                            var deltaDocId = (ulong)NextInteger();
                            var fieldId    = (ulong)NextInteger();
                            var token      = (ulong)NextInteger();

                            current = Occurrence.O(current.DocumentId + deltaDocId,
                                                   fieldId,
                                                   token);
                            break;
                        }

                        default:
                        {
                            throw new Exception("Something wrong");
                        }
                        }

                        if (deltaSelector == 0)
                        {
                            state = 2;
                        }

                        return(true);
                    }
                }
            }