public override void EnterQuery(QueryLanguageParser.QueryContext context)
        {
            var newQuery = SingleQuery.InitiateQuery(CurrentQuery);

            queryStack.Push(newQuery);

            base.EnterQuery(context);
        }
        public override void ExitQuery(QueryLanguageParser.QueryContext context)
        {
            var preparedQuery = queryStack.Pop();

            switch (CurrentProcessingObjectType)
            {
            case ProcessingObjectType.Node:
                break;

            case ProcessingObjectType.ConditionSubject:
                CurrentProcessingQueryNode.CriteriaSubjectQuery = preparedQuery;
                break;

            case ProcessingObjectType.ConditionValue:
                CurrentProcessingQueryNode.CriteriaValueQuery = preparedQuery;
                break;

            case ProcessingObjectType.MethodArgument:
                break;

            case ProcessingObjectType.MethodArgumentSubject:
                CurrentProcessingQueryNode.ArgumentSubjectQuery = preparedQuery;
                break;

            case ProcessingObjectType.MethodArgumentValue:
                CurrentProcessingQueryNode.ArgumentValueQuery = preparedQuery;
                break;

            case ProcessingObjectType.Projection:
                CurrentProcessingQueryNode.Projections[preparedQuery.NodesList.First.Value.GetPivotedName() ?? preparedQuery.NodesList.First.Value.Name] = preparedQuery;
                break;

            case null:
                RootQuery = preparedQuery;
                break;

            default:

                throw new ArgumentOutOfRangeException();
            }

            base.ExitQuery(context);
        }