/// <summary>
        /// perform a logical and of 2 QueryNode trees. if q1 and q2 are ANDQueryNode
        /// nodes it uses head Node from q1 and adds the children of q2 to q1 if q1 is
        /// a AND node and q2 is not, add q2 as a child of the head node of q1 if q2 is
        /// a AND node and q1 is not, add q1 as a child of the head node of q2 if q1
        /// and q2 are not ANDQueryNode nodes, create a AND node and make q1 and q2
        /// children of that node if q1 or q2 is null it returns the not null node if
        /// q1 = q2 = null it returns null
        /// </summary>
        public static IQueryNode LogicalAnd(IQueryNode q1, IQueryNode q2)
        {
            if (q1 == null)
            {
                return(q2);
            }
            if (q2 == null)
            {
                return(q1);
            }

            ANDOperation op /* = null*/;

            if (q1 is AndQueryNode && q2 is AndQueryNode)
            {
                op = ANDOperation.BOTH;
            }
            else if (q1 is AndQueryNode)
            {
                op = ANDOperation.Q1;
            }
            else if (q1 is AndQueryNode)
            {
                op = ANDOperation.Q2;
            }
            else
            {
                op = ANDOperation.NONE;
            }

            IQueryNode result = null;

            switch (op)
            {
            case ANDOperation.NONE:
                List <IQueryNode> children = new List <IQueryNode>();
                children.Add(q1.CloneTree());
                children.Add(q2.CloneTree());
                result = new AndQueryNode(children);
                return(result);

            case ANDOperation.Q1:
                result = q1.CloneTree();
                result.Add(q2.CloneTree());
                return(result);

            case ANDOperation.Q2:
                result = q2.CloneTree();
                result.Add(q1.CloneTree());
                return(result);

            case ANDOperation.BOTH:
                result = q1.CloneTree();
                result.Add(q2.CloneTree().GetChildren());
                return(result);
            }

            return(null);
        }
Beispiel #2
0
        /// <summary>
        /// perform a logical and of 2 QueryNode trees. if q1 and q2 are ANDQueryNode
        /// nodes it uses head Node from q1 and adds the children of q2 to q1 if q1 is
        /// a AND node and q2 is not, add q2 as a child of the head node of q1 if q2 is
        /// a AND node and q1 is not, add q1 as a child of the head node of q2 if q1
        /// and q2 are not ANDQueryNode nodes, create a AND node and make q1 and q2
        /// children of that node if q1 or q2 is null it returns the not null node if
        /// q1 = q2 = null it returns null
        /// </summary>
        public static IQueryNode LogicalAnd(IQueryNode q1, IQueryNode q2)
        {
            if (q1 == null)
            {
                return(q2);
            }
            if (q2 == null)
            {
                return(q1);
            }

            ANDOperation op /* = null*/;

            if (q1 is AndQueryNode && q2 is AndQueryNode)
            {
                op = ANDOperation.BOTH;
            }
            else if (q1 is AndQueryNode)
            {
                op = ANDOperation.Q1;
            }
            else if (q1 is AndQueryNode)
            {
                op = ANDOperation.Q2;
            }
            else
            {
                op = ANDOperation.NONE;
            }

            IQueryNode result; // LUCENENET: IDE0059: Remove unnecessary value assignment

            switch (op)
            {
            case ANDOperation.NONE:
                List <IQueryNode> children = new List <IQueryNode>
                {
                    q1.CloneTree(),
                                  q2.CloneTree()
                };
                result = new AndQueryNode(children);
                return(result);

            case ANDOperation.Q1:
                result = q1.CloneTree();
                result.Add(q2.CloneTree());
                return(result);

            case ANDOperation.Q2:
                result = q2.CloneTree();
                result.Add(q1.CloneTree());
                return(result);

            case ANDOperation.BOTH:
                result = q1.CloneTree();
                result.Add(q2.CloneTree().GetChildren());
                return(result);
            }

            return(null);
        }