internal static SetDiscriminator GetSetDiscriminatorFromRequest(DreamContext context, uint defaultCount, string defaultSortBy) { var discriminator = new SetDiscriminator(); discriminator.Offset = context.GetParam <uint>("offset", 0); discriminator.Limit = defaultCount; var limit = context.GetParam("limit", null) ?? context.GetParam("count", null) ?? context.GetParam("max", discriminator.Limit.ToString()); if (limit.EqualsInvariantIgnoreCase("all")) { discriminator.Limit = uint.MaxValue; } else if (!uint.TryParse(limit, out discriminator.Limit)) { throw new LimitParameterInvalidArgumentException(); } discriminator.SetSortInfo(context.GetParam("sortby", ""), defaultSortBy); return(discriminator); }
internal static SetDiscriminator GetSetDiscriminatorFromRequest(DreamContext context, uint defaultCount, string defaultSortBy) { var discriminator = new SetDiscriminator(); discriminator.Offset = context.GetParam<uint>("offset", 0); discriminator.Limit = defaultCount; var limit = context.GetParam("limit", null) ?? context.GetParam("count", null) ?? context.GetParam("max", discriminator.Limit.ToString()); if(limit.EqualsInvariantIgnoreCase("all")) { discriminator.Limit = uint.MaxValue; } else if(!uint.TryParse(limit, out discriminator.Limit)) { throw new LimitParameterInvalidArgumentException(); } discriminator.SetSortInfo(context.GetParam("sortby", ""), defaultSortBy); return discriminator; }
private Yield CachedSearch(ISearchBL search, SearchQuery query, SetDiscriminator discriminator, bool explain, TrackingInfo trackingInfo, Result<XDoc> result) { if(query.IsEmpty) { yield return search.FormatResultSet(new SearchResult(), discriminator, false, null, new Result<XDoc>()) .Set(result.Return); yield break; } var searchResultSet = search.GetCachedQuery(query); if(!explain && searchResultSet != null && (trackingInfo == null || trackingInfo.QueryId.HasValue)) { // we can only use the cached result set if we either don't have trackingInfo or the trackInfo has a queryId. Otherwise we have to re-query. yield return search.FormatResultSet(searchResultSet, discriminator, false, trackingInfo, new Result<XDoc>()).Set(result.Return); yield break; } // get search results DreamMessage res = null; var lucene = DekiContext.Current.Deki.LuceneIndex.At("compact").With("wikiid", DekiContext.Current.Instance.Id); yield return lucene.With("q", query.LuceneQuery).GetAsync().Set(x => res = x); if(!res.IsSuccessful) { result.Return(new XDoc("documents").Attr("error", string.Format(DekiResources.ERROR_QUERYING_SEARCH_INDEX, query.Raw.EncodeHtmlEntities()))); yield break; } searchResultSet = search.CacheQuery(FilterResults(res.ToDocument()), query, trackingInfo); yield return search.FormatResultSet(searchResultSet, discriminator, explain, trackingInfo, new Result<XDoc>()) .Set(result.Return); }
private Yield UnCachedSearch(SearchQuery query, SetDiscriminator discriminator, Result<XDoc> result) { if(query.IsEmpty) { result.Return(new XDoc("documents")); yield break; } // get search results Result<DreamMessage> res; yield return res = DekiContext.Current.Deki.LuceneIndex .With("wikiid", DekiContext.Current.Instance.Id) .With("q", query.LuceneQuery) .With("max", discriminator.Limit) .With("offset", discriminator.Offset) .With("sortBy", discriminator.SortBy ?? "").GetAsync(); if(!res.Value.IsSuccessful) { result.Return(new XDoc("documents").Attr("error", string.Format(DekiResources.ERROR_QUERYING_SEARCH_INDEX, query.Raw.EncodeHtmlEntities()))); yield break; } result.Return(FilterResults(res.Value.ToDocument())); }
private Yield Search(string queryString, SetDiscriminator discriminator, string constraint, bool useCache, SearchQueryParserType parser, Result<XDoc> result) { if(parser == SearchQueryParserType.Filename) { useCache = false; } switch(discriminator.SortField) { case "date": if(useCache) { discriminator.SortField = "modified"; } break; case "score": if(useCache) { discriminator.SortField = "rank"; } break; case "wordcount": case "size": useCache = false; break; } var search = Resolve<ISearchBL>(DreamContext.Current); var query = search.BuildQuery(queryString, constraint, parser, DekiContext.Current.IsValidApiKeyInRequest); Result<XDoc> docResult; if(useCache) { yield return docResult = Coroutine.Invoke(CachedSearch, search, query, discriminator, false, (TrackingInfo)null, new Result<XDoc>()); } else { yield return docResult = Coroutine.Invoke(UnCachedSearch, query, discriminator, new Result<XDoc>()); } result.Return(RewriteRedirectsAndUris(docResult.Value)); }
private Yield Search(string queryString, uint max, uint offset, string sortBy, string constraint, Result<XDoc> result) { var discriminator = new SetDiscriminator() { Limit = max, Offset = offset, }; discriminator.SetSortInfo(sortBy, "-score"); return Search(queryString, discriminator, constraint, false, SearchQueryParserType.BestGuess, result); }
private Yield CachedSearch(ISearchBL search, SearchQuery query, SetDiscriminator discriminator, bool explain, TrackingInfo trackingInfo, Result<XDoc> result) { if(query.IsEmpty) { yield return search.FormatResultSet(new SearchResult(), discriminator, false, null, new Result<XDoc>()) .Set(result.Return); yield break; } var searchResultSet = search.GetCachedQuery(query); if(!explain && searchResultSet != null && (trackingInfo == null || trackingInfo.QueryId.HasValue)) { // we can only use the cached result set if we either don't have trackingInfo or the trackInfo has a queryId. Otherwise we have to re-query. yield return search.FormatResultSet(searchResultSet, discriminator, false, trackingInfo, new Result<XDoc>()).Set(result.Return); yield break; } // get search results DreamMessage msg = null; var context = DekiContext.Current; var searchPlug = context.Deki.LuceneIndex .At("compact") .With("q", query.LuceneQuery) .With("wikiid", context.Instance.Id); if(!DekiContext.Current.IsValidApiKeyInRequest) { searchPlug = searchPlug .With("userid", context.User.ID) .With("apiuri", Self.Uri.AsPublicUri().ToString()); } yield return searchPlug .Get(new Result<DreamMessage>()) .Set(x => msg = x); if(!msg.IsSuccessful) { var resources = context.Resources; result.Return(new XDoc("documents").Attr("error", resources.Localize(DekiResources.ERROR_QUERYING_SEARCH_INDEX(query)))); yield break; } searchResultSet = search.CacheQuery(msg.ToDocument(), query, trackingInfo); yield return search.FormatResultSet(searchResultSet, discriminator, explain, trackingInfo, new Result<XDoc>()) .Set(result.Return); }
private Yield UnCachedSearch(SearchQuery query, SetDiscriminator discriminator, Result<XDoc> result) { if(query.IsEmpty) { result.Return(new XDoc("documents")); yield break; } // get search results DreamMessage msg = null; var context = DekiContext.Current; var searchPlug = context.Deki.LuceneIndex .With("q", query.LuceneQuery) .With("max", discriminator.Limit) .With("offset", discriminator.Offset) .With("sortBy", discriminator.SortBy ?? "") .With("wikiid", context.Instance.Id); if(!DekiContext.Current.IsValidApiKeyInRequest) { searchPlug = searchPlug .With("userid", context.User.ID) .With("apiuri", Self.Uri.AsPublicUri().ToString()); } yield return searchPlug .Get(new Result<DreamMessage>()) .Set(x => msg = x); if(!msg.IsSuccessful) { var resources = context.Resources; result.Return(new XDoc("documents").Attr("error", resources.Localize(DekiResources.ERROR_QUERYING_SEARCH_INDEX(query)))); yield break; } result.Return(msg.ToDocument()); }