/// <summary> /// Adds or replaces a <see cref="TermNode"/> /// </summary> public bool TryAddOrReplace(TermNode term) { // Check the term options if (!TermOptions.TryGetValue(term.TermName, out var termOption)) { return(false); } if (_terms.TryGetValue(term.TermName, out var existingTerm)) { if (termOption.Single) { // Replace _terms[term.TermName] = term; return(true); } // Add if (existingTerm is CompoundTermNode compound) { compound.Children.Add(term as TermOperationNode); } else { var newCompound = new AndTermNode(existingTerm as TermOperationNode, term as TermOperationNode); _terms[term.TermName] = newCompound; return(true); } } _terms[term.TermName] = term; return(true); }
public Func <IQuery <T>, ValueTask <IQuery <T> > > Visit(AndTermNode node, QueryExecutionContext <T> argument) { var predicates = new List <Func <IQuery <T>, ValueTask <IQuery <T> > > >(); foreach (var child in node.Children) { Func <IQuery <T>, ValueTask <IQuery <T> > > predicate = (q) => argument.Item.AllAsync( (q) => child.Operation.Accept(this, argument)(q) ); predicates.Add(predicate); } Func <IQuery <T>, ValueTask <IQuery <T> > > result = (Func <IQuery <T>, ValueTask <IQuery <T> > >)Delegate.Combine(predicates.ToArray()); return(result); }