/// <summary> /// Adds <see cref="TextQuery"/> to query. /// </summary> /// <param name="wrapper">Query wrapper.</param> /// <param name="query">Query object.</param> /// <param name="paths">Expression path to querying field.</param> public static QueryWrapper <T> Text <T>(this QueryWrapper <T> wrapper, TextQuery query, params Expression <Func <T, object> >[] paths) where T : class { if (query == null || !query.IsSpecified) { return(wrapper); } return(wrapper.AddQuery(descriptor => { var container = null as QueryContainer; foreach (var value in query.Values) { if (string.IsNullOrEmpty(value)) { continue; } var c = descriptor.SimpleQueryString(q => q.Query(value).Fields(f => paths.Aggregate(f, (ff, p) => ff.Field(p))).DefaultOperator(query.Mode == QueryMatchMode.All ? Operator.And : Operator.Or)); if (container == null) { container = c; } else { switch (query.Mode) { case QueryMatchMode.Any: container |= c; break; case QueryMatchMode.All: container &= c; break; } } } return container; })); }
/// <summary> /// Adds <see cref="FilterQuery{T}"/> to query. /// </summary> /// <param name="wrapper">Query wrapper.</param> /// <param name="query">Query object.</param> /// <param name="path">Expression path to querying field.</param> public static QueryWrapper <T> Filter <T, TField>(this QueryWrapper <T> wrapper, FilterQuery <TField> query, Expression <Func <T, object> > path) where T : class { if (query == null || !query.IsSpecified) { return(wrapper); } return(wrapper.AddQuery(descriptor => { var container = null as QueryContainer; foreach (var value in query.Values) { var c = descriptor.Term(t => t.Field(path).Value(value)); if (container == null) { container = c; } else { switch (query.Mode) { case QueryMatchMode.Any: container |= c; break; case QueryMatchMode.All: container &= c; break; } } } return container; })); }
/// <summary> /// Nested equivalent of <see cref="MultiQuery{T}"/>. /// </summary> public static QueryWrapper <T> Nested <T>(this QueryWrapper <T> wrapper, Func <QueryWrapper <T>, QueryWrapper <T> > query) where T : class => wrapper.AddQuery(q => query(new QueryWrapper <T>(q)).Container);