Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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);
        }