public async Task BuildAsync <T>(QueryBuilderContext <T> ctx) where T : class, new()
        {
            string filter = ctx.Source.GetFilterExpression();
            string search = ctx.Source.GetSearchExpression();
            string sort   = ctx.Source.GetSortExpression();

            // NOTE: Calling UseScoring here to keep the query from being wrapped in a filter which happens ElasticQueryBuilderExtensions.BuildQuery
            if (!String.IsNullOrEmpty(filter))
            {
                ctx.Filter &= await _parser.BuildQueryAsync(filter, ctx.SetDefaultOperator(Operator.And).UseScoring()).AnyContext();
            }

            if (!String.IsNullOrEmpty(search))
            {
                ctx.Query &= await _parser.BuildQueryAsync(search, ctx.SetDefaultOperator(Operator.Or).UseScoring()).AnyContext();
            }

            if (!String.IsNullOrEmpty(sort))
            {
                ctx.Search.Sort(await _parser.BuildSortAsync(sort, ctx).AnyContext());
            }
        }
        public async Task BuildAsync <T>(QueryBuilderContext <T> ctx) where T : class, new()
        {
            var searchQuery = ctx.GetSourceAs <ISearchQuery>();

            if (searchQuery == null)
            {
                return;
            }

            if (!String.IsNullOrEmpty(searchQuery.Criteria))
            {
                ctx.Query &= await _parser.BuildQueryAsync(searchQuery.Criteria, ctx).AnyContext();
            }

            if (!String.IsNullOrEmpty(searchQuery.Filter))
            {
                ctx.Filter &= await _parser.BuildFilterAsync(searchQuery.Filter, ctx).AnyContext();
            }

            if (!String.IsNullOrEmpty(searchQuery.Sort))
            {
                ctx.Search.Sort(await _parser.BuildSortAsync(searchQuery.Sort, ctx).AnyContext());
            }
        }