Exemplo n.º 1
0
        public async Task <SearchResults> SearchAsync(string query, Context context)
        {
            var result = new SearchResults();

            var searchFilter = await CreateSearchFilterAsync(context);

            if (searchFilter == null)
            {
                return(result);
            }

            var ids = await contentTextIndexer.SearchAsync($"{query}~", context.App, searchFilter, context.Scope());

            if (ids == null || ids.Count == 0)
            {
                return(result);
            }

            var appId = context.App.NamedId();

            var contents = await contentQuery.QueryAsync(context, ids);

            foreach (var content in contents)
            {
                var url = urlGenerator.ContentUI(appId, content.SchemaId, content.Id);

                var name = FormatName(content, context.App.LanguagesConfig.Master);

                result.Add(name, SearchResultType.Content, url, content.SchemaDisplayName);
            }

            return(result);
        }
Exemplo n.º 2
0
        public async Task <IResultList <IContentEntity> > DoAsync(IAppEntity app, ISchemaEntity schema, ClrQuery query, SearchScope scope)
        {
            Guard.NotNull(app);
            Guard.NotNull(schema);
            Guard.NotNull(query);

            try
            {
                query = query.AdjustToModel(schema.SchemaDef);

                List <Guid>?fullTextIds = null;

                if (!string.IsNullOrWhiteSpace(query.FullText))
                {
                    var searchFilter = SearchFilter.ShouldHaveSchemas(schema.Id);

                    fullTextIds = await indexer.SearchAsync(query.FullText, app, searchFilter, scope);

                    if (fullTextIds?.Count == 0)
                    {
                        return(ResultList.CreateFrom <IContentEntity>(0));
                    }
                }

                var filter = CreateFilter(schema.Id, fullTextIds, query);

                var contentCount = Collection.Find(filter).CountDocumentsAsync();
                var contentItems =
                    Collection.Find(filter)
                    .QueryLimit(query)
                    .QuerySkip(query)
                    .QuerySort(query)
                    .ToListAsync();

                await Task.WhenAll(contentItems, contentCount);

                foreach (var entity in contentItems.Result)
                {
                    entity.ParseData(schema.SchemaDef, serializer);
                }

                return(ResultList.Create <IContentEntity>(contentCount.Result, contentItems.Result));
            }
            catch (MongoQueryException ex)
            {
                if (ex.Message.Contains("17406"))
                {
                    throw new DomainException("Result set is too large to be retrieved. Use $top parameter to reduce the number of items.");
                }
                else
                {
                    throw;
                }
            }
        }