Ejemplo n.º 1
0
        public override async Task VisitAsync(TermNode node, IQueryVisitorContext context)
        {
            var filteredNode = ApplyFilter(node, context);

            if (filteredNode is GroupNode newGroupNode)
            {
                await base.VisitAsync(newGroupNode, context);

                return;
            }

            if (String.Equals(node.Field, "status", StringComparison.OrdinalIgnoreCase) &&
                !node.IsNegated.GetValueOrDefault() &&
                String.Equals(node.Term, "open", StringComparison.OrdinalIgnoreCase))
            {
                HasStatusOpen = true;
            }

            if (QueryMode != EventStackFilterQueryMode.InvertedStacks)
            {
                return;
            }

            if (_stackNonInvertedFields.Contains(filteredNode.Field))
            {
                return;
            }

            var groupNode = node.GetGroupNode();

            // check to see if we already inverted the group
            if (groupNode.Data.ContainsKey("@IsInverted"))
            {
                return;
            }

            var referencedFields = await GetReferencedFieldsQueryVisitor.RunAsync(groupNode, context);

            if (referencedFields.Any(f => _stackNonInvertedFields.Contains(f)))
            {
                // if we have referenced fields that are on the list of non-inverted fields and the operator is an OR then its an issue, mark invert unsuccessful
                if (node.GetOperator(context) == GroupOperator.Or)
                {
                    IsInvertSuccessful = false;
                    return;
                }

                node.IsNegated = node.IsNegated.HasValue ? !node.IsNegated : true;
                return;
            }

            // negate the entire group
            if (groupNode.Left != null)
            {
                groupNode.IsNegated = groupNode.IsNegated.HasValue ? !groupNode.IsNegated : true;
                if (groupNode.Right != null)
                {
                    groupNode.HasParens = true;
                }
            }

            groupNode.Data["@IsInverted"] = true;
        }