Пример #1
0
        /// <summary>
        /// Only get the word step doc index.
        /// </summary>
        /// <param name="word"></param>
        /// <param name="filePositionList"></param>
        /// <param name="totalDocs"></param>
        /// <param name="dbProvider"></param>
        /// <param name="maxReturnCount"></param>
        /// <returns></returns>
        internal Hubble.Core.Index.WordIndexReader GetWordIndexWithWordStepDocIndex(string word,
                                                                                    WordFilePositionList filePositionList, int totalDocs, Data.DBProvider dbProvider, int maxReturnCount)
        {
            List <WordStepDocIndex.IndexFileInfo> indexFileInfoList =
                new List <WordStepDocIndex.IndexFileInfo>(); //StepDocIndex of all index files

            bool simple       = _IndexMode == Hubble.Core.Data.Field.IndexMode.Simple;
            long wordCountSum = 0;

            foreach (FilePosition filePosition in filePositionList.FPList)
            {
                IDXFile idxFile = GetIDXFile(filePosition.Serial);

                if (idxFile == null)
                {
                    continue;
                }

                int  count;
                long indexPosition;

                List <Hubble.Core.Entity.DocumentPosition> stepDocIndex =
                    idxFile.GetStepDocIndex(filePosition.Position, filePosition.Length, out count, out indexPosition);

                indexFileInfoList.Add(new WordStepDocIndex.IndexFileInfo(stepDocIndex,
                                                                         new FilePosition(filePosition.Serial, indexPosition,
                                                                                          (int)(filePosition.Length - (indexPosition - filePosition.Position) - sizeof(int))), //Subtract last 4 bytes for last doc id and Subtract stepdocindex length
                                                                         count));

                wordCountSum += count;
            }

            int relDocCount = (int)wordCountSum;

            //if (maxReturnCount >= 0)
            //{
            //    if (wordCountSum > maxReturnCount)
            //    {
            //        relDocCount = maxReturnCount;
            //    }
            //}

            WordStepDocIndex wordStepDocIndex = new WordStepDocIndex(indexFileInfoList,
                                                                     wordCountSum, relDocCount, simple);

            return(new WordIndexReader(word, wordStepDocIndex, totalDocs,
                                       dbProvider, _IndexFileProxy, maxReturnCount));
        }
Пример #2
0
        internal Hubble.Core.Index.WordIndexReader GetWordIndex(string word,
                                                                WordFilePositionList filePositionList, int totalDocs, Data.DBProvider dbProvider, int maxReturnCount)
        {
            WordDocumentsList docList = new WordDocumentsList();

            bool simple = _IndexMode == Hubble.Core.Data.Field.IndexMode.Simple;

            if (maxReturnCount < 0)
            {
                foreach (FilePosition filePosition in filePositionList.FPList)
                {
                    IDXFile idxFile = GetIDXFile(filePosition.Serial);

                    if (idxFile == null)
                    {
                        continue;
                    }

                    WordDocumentsList wdl = idxFile.GetDocList(filePosition.Position, filePosition.Length, -1, simple);

                    if (filePositionList.Count == 1)
                    {
                        docList = wdl;
                    }
                    else
                    {
                        docList.AddRange(wdl);
                        docList.WordCountSum += wdl.WordCountSum;
                    }
                }
            }
            else
            {
                int remain = maxReturnCount;

                foreach (FilePosition filePosition in filePositionList.FPList)
                {
                    IDXFile idxFile = GetIDXFile(filePosition.Serial);

                    if (idxFile == null)
                    {
                        continue;
                    }

                    WordDocumentsList wdl = idxFile.GetDocList(filePosition.Position, filePosition.Length, remain, simple);

                    if (filePositionList.Count == 1)
                    {
                        docList = wdl;
                    }
                    else
                    {
                        docList.AddRange(wdl);
                        docList.WordCountSum += wdl.WordCountSum;
                        docList.RelDocCount  += wdl.RelDocCount;
                    }

                    remain -= wdl.Count;
                }
            }

            return(new WordIndexReader(word, docList, totalDocs, dbProvider));
        }