예제 #1
0
        public override Task <DocumentQueryResult> ExecuteQuery(IndexQueryServerSide query, DocumentsOperationContext documentsContext, long?existingResultEtag, OperationCancelToken token)
        {
            var result = new DocumentQueryResult();

            if (documentsContext.Transaction == null || documentsContext.Transaction.Disposed)
            {
                documentsContext.OpenReadTransaction();
            }

            FillCountOfResultsAndIndexEtag(result, query.Metadata, documentsContext);

            if (query.Metadata.HasOrderByRandom == false && existingResultEtag.HasValue)
            {
                if (result.ResultEtag == existingResultEtag)
                {
                    return(Task.FromResult(DocumentQueryResult.NotModifiedResult));
                }
            }

            var collection = GetCollectionName(query.Metadata.CollectionName, out var indexName);

            using (QueryRunner.MarkQueryAsRunning(indexName, query, token))
            {
                result.IndexName = indexName;

                ExecuteCollectionQuery(result, query, collection, documentsContext, pulseReadingTransaction: false, token.Token);

                return(Task.FromResult(result));
            }
        }
예제 #2
0
        public override async Task <DocumentQueryResult> ExecuteQuery(IndexQueryServerSide query, QueryOperationContext queryContext, long?existingResultEtag, OperationCancelToken token)
        {
            var result = new DocumentQueryResult();

            if (queryContext.AreTransactionsOpened() == false)
            {
                queryContext.OpenReadTransaction();
            }

            FillCountOfResultsAndIndexEtag(result, query.Metadata, queryContext);

            if (query.Metadata.HasOrderByRandom == false && existingResultEtag.HasValue)
            {
                if (result.ResultEtag == existingResultEtag)
                {
                    return(DocumentQueryResult.NotModifiedResult);
                }
            }

            var collection = GetCollectionName(query.Metadata.CollectionName, out var indexName);

            using (QueryRunner.MarkQueryAsRunning(indexName, query, token))
            {
                result.IndexName = indexName;

                await ExecuteCollectionQueryAsync(result, query, collection, queryContext, pulseReadingTransaction : false, token.Token);

                return(result);
            }
        }
예제 #3
0
        public override Task <DocumentQueryResult> ExecuteQuery(IndexQueryServerSide query, DocumentsOperationContext documentsContext, long?existingResultEtag, OperationCancelToken token)
        {
            var result = new DocumentQueryResult();

            documentsContext.OpenReadTransaction();

            FillCountOfResultsAndIndexEtag(result, query.Metadata, documentsContext);

            if (query.Metadata.HasOrderByRandom == false && existingResultEtag.HasValue)
            {
                if (result.ResultEtag == existingResultEtag)
                {
                    return(Task.FromResult(DocumentQueryResult.NotModifiedResult));
                }
            }

            ExecuteCollectionQuery(result, query, query.Metadata.CollectionName, documentsContext, token.Token);

            return(Task.FromResult(result));
        }
예제 #4
0
        public Task <DocumentQueryResult> Execute(string dynamicIndexName, IndexQueryServerSide query, long?existingResultEtag)
        {
            string collection;
            var    index = MatchIndex(dynamicIndexName, query, true, out collection);

            if (index == null)
            {
                var result = new DocumentQueryResult();
                ExecuteCollectionQuery(result, query, collection);
                return(new CompletedTask <DocumentQueryResult>(result));
            }

            if (existingResultEtag.HasValue)
            {
                var etag = index.GetIndexEtag();
                if (etag == existingResultEtag)
                {
                    return(new CompletedTask <DocumentQueryResult>(DocumentQueryResult.NotModifiedResult));
                }
            }

            return(index.Query(query, _context, _token));
        }
예제 #5
0
        public async Task <DocumentQueryResult> Execute(IndexQueryServerSide query, long?existingResultEtag)
        {
            var tuple = await MatchIndex(query, true);

            var index      = tuple.Index;
            var collection = tuple.Collection;

            if (index == null)
            {
                var result = new DocumentQueryResult();
                _context.OpenReadTransaction();
                FillCountOfResultsAndIndexEtag(result, collection);

                if (existingResultEtag.HasValue)
                {
                    if (result.ResultEtag == existingResultEtag)
                    {
                        return(DocumentQueryResult.NotModifiedResult);
                    }
                }

                ExecuteCollectionQuery(result, query, collection);

                return(result);
            }

            if (existingResultEtag.HasValue)
            {
                var etag = index.GetIndexEtag();
                if (etag == existingResultEtag)
                {
                    return(DocumentQueryResult.NotModifiedResult);
                }
            }

            return(await index.Query(query, _context, _token));
        }
        public static void WriteDocumentQueryResult(this BlittableJsonTextWriter writer, JsonOperationContext context, DocumentQueryResult result, bool metadataOnly, out int numberOfResults)
        {
            writer.WriteStartObject();

            writer.WritePropertyName(nameof(result.TotalResults));
            writer.WriteInteger(result.TotalResults);
            writer.WriteComma();

            writer.WritePropertyName(nameof(result.SkippedResults));
            writer.WriteInteger(result.SkippedResults);
            writer.WriteComma();

            writer.WritePropertyName(nameof(result.DurationInMs));
            writer.WriteInteger(result.DurationInMs);
            writer.WriteComma();


            writer.WriteArray(nameof(result.IncludedPaths),
                              result.IncludedPaths);
            writer.WriteComma();

            writer.WriteQueryResult(context, result, metadataOnly, out numberOfResults, partial: true);

            writer.WriteEndObject();
        }