Raven.Database.Indexing.Index.IndexQueryOperation.Query C# (CSharp) Method

Query() public method

public Query ( ) : IEnumerable
return IEnumerable
			public IEnumerable<IndexQueryResult> Query()
			{
				using(IndexStorage.EnsureInvariantCulture())
				{
					AssertQueryDoesNotContainFieldsThatAreNotIndexes();
					IndexSearcher indexSearcher;
					using(parent.GetSearcher(out indexSearcher))
					{
						var luceneQuery = GetLuceneQuery();

						foreach (var indexQueryTrigger in indexQueryTriggers)
						{
							luceneQuery = indexQueryTrigger.Value.ProcessQuery(parent.name, luceneQuery, indexQuery);
						}

						int start = indexQuery.Start;
						int pageSize = indexQuery.PageSize;
						int returnedResults = 0;
						int skippedResultsInCurrentLoop = 0;
						do
						{
							if (skippedResultsInCurrentLoop > 0)
							{
								start = start + pageSize;
								// trying to guesstimate how many results we will need to read from the index
								// to get enough unique documents to match the page size
								pageSize = skippedResultsInCurrentLoop * indexQuery.PageSize;
								skippedResultsInCurrentLoop = 0;
							}
							TopDocs search = ExecuteQuery(indexSearcher, luceneQuery, start, pageSize, indexQuery);
							indexQuery.TotalSize.Value = search.totalHits;

							RecordResultsAlreadySeenForDistinctQuery(indexSearcher, search, start);

							for (int i = start; i < search.totalHits && (i - start) < pageSize; i++)
							{
								Document document = indexSearcher.Doc(search.scoreDocs[i].doc);
								IndexQueryResult indexQueryResult = parent.RetrieveDocument(document, fieldsToFetch, search.scoreDocs[i].score);
								if (ShouldIncludeInResults(indexQueryResult) == false)
								{
									indexQuery.SkippedResults.Value++;
									skippedResultsInCurrentLoop++;
									continue;
								}

								returnedResults++;
								yield return indexQueryResult;
								if (returnedResults == indexQuery.PageSize)
									yield break;
							}
						} while (skippedResultsInCurrentLoop > 0 && returnedResults < indexQuery.PageSize);
					}
				}
			}

Usage Example

示例#1
0
        public IEnumerable <IndexQueryResult> Query(
            string index,
            IndexQuery query,
            Func <IndexQueryResult, bool> shouldIncludeInResults,
            FieldsToFetch fieldsToFetch,
            OrderedPartCollection <AbstractIndexQueryTrigger> indexQueryTriggers)
        {
            Index value;

            if (indexes.TryGetValue(index, out value) == false)
            {
                log.Debug("Query on non existing index '{0}'", index);
                throw new InvalidOperationException("Index '" + index + "' does not exists");
            }

            var indexQueryOperation = new Index.IndexQueryOperation(value, query, shouldIncludeInResults, fieldsToFetch, indexQueryTriggers);

            if (query.Query != null && query.Query.Contains(Constants.IntersectSeperator))
            {
                return(indexQueryOperation.IntersectionQuery());
            }
            return(indexQueryOperation.Query());
        }
All Usage Examples Of Raven.Database.Indexing.Index.IndexQueryOperation::Query