예제 #1
0
        protected IndexOperation SearchText(List <DomainId>?expected, string text, SearchScope target = SearchScope.All)
        {
            return(async p =>
            {
                var query = new TextQuery(text, TextFilter.ShouldHaveSchemas(schemaId.Id));

                var result = await p.TextIndex.SearchAsync(app, query, target);

                if (expected != null)
                {
                    result.Should().BeEquivalentTo(expected.ToHashSet());
                }
                else
                {
                    result.Should().BeEmpty();
                }
            });
        }
예제 #2
0
        private async Task TransformFilterAsync(ClrQuery query, Context context, ISchemaEntity?schema)
        {
            if (query.Filter != null && schema != null)
            {
                query.Filter = await GeoQueryTransformer.TransformAsync(query.Filter, context, schema, textIndex);
            }

            if (!string.IsNullOrWhiteSpace(query.FullText))
            {
                if (schema == null)
                {
                    throw new InvalidOperationException();
                }

                var textQuery = new TextQuery(query.FullText, TextFilter.ShouldHaveSchemas(schema.Id));

                var fullTextIds = await textIndex.SearchAsync(context.App, textQuery, context.Scope());

                var fullTextFilter = ClrFilter.Eq("id", "__notfound__");

                if (fullTextIds?.Any() == true)
                {
                    fullTextFilter = ClrFilter.In("id", fullTextIds.Select(x => x.ToString()).ToList());
                }

                if (query.Filter != null)
                {
                    query.Filter = ClrFilter.And(query.Filter, fullTextFilter);
                }
                else
                {
                    query.Filter = fullTextFilter;
                }

                query.FullText = null;
            }
        }