public VerseAnalysis GetForVerse(int chapterNumber, int verseNumber) { var query = new BooleanQuery(disableCoord: true); query .FilterByType <VerseAnalysis>() .AddNumericRangeQuery <VerseAnalysis>( x => x.ChapterNumber, lowerInclusive: chapterNumber, upperInclusive: chapterNumber, occur: Occur.MUST) .AddNumericRangeQuery <VerseAnalysis>( x => x.VerseNumber, lowerInclusive: verseNumber, upperInclusive: verseNumber, occur: Occur.MUST); IndexSearcher indexSearcher = IndexSearcherProvider.GetIndexSearcher(); TopDocs docs = indexSearcher.Search(query, 999); VerseAnalysis result = docs.ScoreDocs .Select(x => indexSearcher.Doc(x.Doc)) .Single() .GetObject <VerseAnalysis>(); return(result); }
public void Write(VerseAnalysis verseAnalysis) { IEnumerable <string> roots = verseAnalysis.Words .SelectMany(x => x.WordParts) .Where(x => !string.IsNullOrWhiteSpace(x.Root)) .Select(x => x.Root) .Distinct() .Select(ArabicWordIndexer.GetIndexForArabic); var document = new Document(); document.StoreAndIndex(verseAnalysis, x => x.ChapterNumber); document.StoreAndIndex(verseAnalysis, x => x.VerseNumber); document.IndexArray(VerseAnalysisRepository.RootWordsIndexName, roots); document.AddObject(verseAnalysis); IndexWriter indexWriter = IndexWriterProvider.GetIndexWriter(); indexWriter.AddDocument(document); }
public ActionResult Index(int chapterNumber, int verseNumber) { if (!QuranStructure.TryValidateChapterAndVerse(chapterNumber, verseNumber)) { return(HttpNotFound()); } Chapter chapter = ChapterRepository.Get(chapterNumber); VerseAnalysis analysis = VerseAnalysisRepository.GetForVerse(chapterNumber, verseNumber); var selectChapterAndVerse = new SelectChapterAndVerse( selectedChapterNumber: chapterNumber, selectedVerseNumber: verseNumber, url: "/Analysis/"); var viewModel = new ViewModel( chapter: chapter, verseNumber: verseNumber, verseAnalysis: analysis, selectChapterAndVerse: selectChapterAndVerse); return(View("VerseAnalysis", viewModel)); }
private VerseViewModel CreateVerseViewModel( VerseAnalysis verseAnalysis, VerseAnalysisWord analysisWord, VerseAnalysisWordPart analysisWordPart) { const int WordsBeforeAndAfter = 3; int lower = Math.Max(1, analysisWord.WordNumber - WordsBeforeAndAfter); int upper = Math.Min(verseAnalysis.Words.Count, analysisWord.WordNumber + WordsBeforeAndAfter); var words = new List <VerseAnalysisWord>(); for (int index = lower - 1; index < upper; index++) { words.Add(verseAnalysis.Words[index]); } var result = new VerseViewModel( chapterNumber: verseAnalysis.ChapterNumber, verseNumber: verseAnalysis.VerseNumber, selectedWord: analysisWord, selectedWordPart: analysisWordPart, words: words); return(result); }