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); } }
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); } }