Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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()));
        }
Ejemplo n.º 5
0
 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));
 }
Ejemplo n.º 6
0
 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);
 }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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());
        }