/// <summary>
        /// Interface implementaion. Returns string for 'Filter' or 'Segment' parameters of Google Analytics query by given lambda expression.
        /// </summary>
        /// <param name="expression">Lambda expression</param>
        /// <returns>String for 'Filter' parameter for Google Analytics query</returns>
        public string Parse(Expression <Predicate <ContextDataModel> > expression)
        {
            Parsers.IExpression rootExpression = getExpression(expression.Body);
            string result = rootExpression.ParseToString();

            return(result);
        }
        private Parsers.IExpression parseBinaryExpression(Expression expression)
        {
            Parsers.IExpression result           = null;
            BinaryExpression    binaryExpression = expression as BinaryExpression;

            if (binaryExpression != null)
            {
                var nodeType = binaryExpression.NodeType;
                if (nodeType == ExpressionType.AndAlso || nodeType == ExpressionType.OrElse)
                {
                    var conditionExpression = new Parsers.ConditionalExpression();
                    conditionExpression.Left  = getExpression(binaryExpression.Left);
                    conditionExpression.Right = getExpression(binaryExpression.Right);
                    switch (nodeType)
                    {
                    case ExpressionType.AndAlso:
                        conditionExpression.Operator = Parsers.BooleanOperator.And;
                        break;

                    case ExpressionType.OrElse:
                        conditionExpression.Operator = Parsers.BooleanOperator.Or;
                        break;
                    }
                    result = conditionExpression;
                }
                else
                {
                    Parsers.DataFieldExpression fieldExpression = null;
                    switch (nodeType)
                    {
                    case ExpressionType.Equal:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.Equals, binaryExpression);
                        break;

                    case ExpressionType.NotEqual:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.NotEquals, binaryExpression);
                        break;

                    case ExpressionType.LessThan:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.Less, binaryExpression);
                        break;

                    case ExpressionType.LessThanOrEqual:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.EqualsOrLess, binaryExpression);
                        break;

                    case ExpressionType.GreaterThan:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.Greater, binaryExpression);
                        break;

                    case ExpressionType.GreaterThanOrEqual:
                        fieldExpression = createDataFieldExpression(Parsers.ConditionalOperator.EqualsOrGereater, binaryExpression);
                        break;
                    }
                    result = fieldExpression;
                }
            }
            return(result);
        }