Esempio n. 1
0
        public Task Terms()
        {
            var name      = GetQueryStringValueAndAssertIfSingleAndNotEmpty("name");
            var field     = GetQueryStringValueAndAssertIfSingleAndNotEmpty("field");
            var fromValue = GetStringQueryString("fromValue", required: false);

            using (var token = CreateTimeLimitedOperationToken())
                using (Database.DocumentsStorage.ContextPool.AllocateOperationContext(out DocumentsOperationContext context))
                    using (context.OpenReadTransaction())
                    {
                        var existingResultEtag = GetLongFromHeaders("If-None-Match");

                        var result = Database.QueryRunner.ExecuteGetTermsQuery(name, field, fromValue, existingResultEtag, GetPageSize(), context, token);

                        if (result.NotModified)
                        {
                            HttpContext.Response.StatusCode = (int)HttpStatusCode.NotModified;
                            return(Task.CompletedTask);
                        }

                        HttpContext.Response.Headers[Constants.Headers.Etag] = CharExtensions.ToInvariantString(result.ResultEtag);

                        using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                        {
                            writer.WriteTermsQueryResult(context, result);
                        }

                        return(Task.CompletedTask);
                    }
        }
Esempio n. 2
0
        public Task Terms()
        {
            var field = GetQueryStringValueAndAssertIfSingleAndNotEmpty("field");

            using (var token = CreateTimeLimitedOperationToken())
                using (Database.DocumentsStorage.ContextPool.AllocateOperationContext(out DocumentsOperationContext context))
                    using (context.OpenReadTransaction())
                    {
                        var name = GetIndexNameFromCollectionAndField(field) ?? GetQueryStringValueAndAssertIfSingleAndNotEmpty("name");

                        var fromValue          = GetStringQueryString("fromValue", required: false);
                        var existingResultEtag = GetLongFromHeaders("If-None-Match");

                        var result = Database.QueryRunner.ExecuteGetTermsQuery(name, field, fromValue, existingResultEtag, GetPageSize(), context, token, out var index);

                        if (result.NotModified)
                        {
                            HttpContext.Response.StatusCode = (int)HttpStatusCode.NotModified;
                            return(Task.CompletedTask);
                        }

                        HttpContext.Response.Headers[Constants.Headers.Etag] = CharExtensions.ToInvariantString(result.ResultEtag);

                        using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                        {
                            if (field.EndsWith("__minX") ||
                                field.EndsWith("__minY") ||
                                field.EndsWith("__maxX") ||
                                field.EndsWith("__maxY"))
                            {
                                if (index.Definition.IndexFields != null &&
                                    index.Definition.IndexFields.TryGetValue(field.Substring(0, field.Length - 6), out var indexField) == true)
                                {
                                    if (indexField.Spatial?.Strategy == Client.Documents.Indexes.Spatial.SpatialSearchStrategy.BoundingBox)
                                    {
                                        // Term-values for 'Spatial Index Fields' with 'BoundingBox' are encoded in Lucene as 'prefixCoded bytes'
                                        // Need to convert to numbers for the Studio
                                        var readableTerms = new HashSet <string>();
                                        foreach (var item in result.Terms)
                                        {
                                            var num = Lucene.Net.Util.NumericUtils.PrefixCodedToDouble(item);
                                            readableTerms.Add(NumberUtil.NumberToString(num));
                                        }

                                        result.Terms = readableTerms;
                                    }
                                }
                            }

                            writer.WriteTermsQueryResult(context, result);
                        }

                        return(Task.CompletedTask);
                    }
        }