private void ProcessSelectable(bool isSubQuery, ISelectableQueryComponent expression, Func <string, string> createVariableName, StrongEntityAccessor mainEntityAccessor)
        {
            System.Reflection.MethodInfo processSelectable = typeof(GenericSparqlQueryVisitor).GetTypeInfo().GetMethod("ProcessSelectable" + expression.GetType().Name, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            if (processSelectable != null)
            {
                processSelectable.Invoke(this, new object[] { expression, isSubQuery, createVariableName, mainEntityAccessor });
            }

            foreach (IExpression selectableExpression in expression.Expressions)
            {
                VisitComponent(selectableExpression);
                _commandText.Append(" ");
            }
        }
        private void ProcessSelectable(bool isSubQuery, ISelectableQueryComponent expression, Func<string, string> createVariableName)
        {
            if (!isSubQuery)
            {
                if (expression is UnspecifiedEntityAccessor)
                {
                    if ((_metaGraphVariableName == null) && (_entityVariableName == null))
                    {
                        _metaGraphVariableName = "graph";
                        _entityVariableName = ((StrongEntityAccessor)expression).About.Name;
                    }

                    _commandText.AppendFormat(
                        "IF(BOUND(?G{0}),?G{0},?G{1}) AS ?{2} ",
                        ((UnspecifiedEntityAccessor)expression).About.Name,
                        ((UnspecifiedEntityAccessor)expression).EntityAccessor.About.Name,
                        _metaGraphVariableName);
                }
                else if (expression is IdentifierEntityAccessor)
                {
                    if ((_metaGraphVariableName == null) && (_entityVariableName == null))
                    {
                        _metaGraphVariableName = String.Format("G{0}", ((StrongEntityAccessor)expression).About.Name);
                        _entityVariableName = ((StrongEntityAccessor)expression).About.Name + "_Distinct";
                    }

                    _subjectVariableName = ((StrongEntityAccessor)expression).About.Name;
                    _predicateVariableName = ((StrongEntityAccessor)expression).About.Name + "_Predicate";
                    _objectVariableName = ((StrongEntityAccessor)expression).About.Name + "_Object";
                    _commandText.AppendFormat(
                        "DISTINCT(?{2}) AS ?{1} ?{0} ?{3} ?{4} ",
                        _metaGraphVariableName,
                        _entityVariableName,
                        ((StrongEntityAccessor)expression).About.Name,
                        _predicateVariableName,
                        _objectVariableName);
                }
                else if (expression is StrongEntityAccessor)
                {
                    if ((_metaGraphVariableName == null) && (_entityVariableName == null))
                    {
                        _metaGraphVariableName = String.Format("G{0}", _entityVariableName = ((StrongEntityAccessor)expression).About.Name);
                    }

                    _commandText.AppendFormat("?{0} ", _metaGraphVariableName);
                }
                else if (expression is UnboundConstrain)
                {
                    UnboundConstrain unboundConstrain = (UnboundConstrain)expression;
                    if ((unboundConstrain.Subject is Identifier) && (unboundConstrain.Predicate is Identifier) && (unboundConstrain.Value is Identifier))
                    {
                        _subjectVariableName = ((Identifier)unboundConstrain.Subject).Name;
                        _predicateVariableName = ((Identifier)unboundConstrain.Predicate).Name;
                        _objectVariableName = ((Identifier)unboundConstrain.Value).Name;
                    }
                }
                else if (expression is Call)
                {
                    if (_scalarVariableName == null)
                    {
                        _scalarVariableName = createVariableName(((Call)expression).Member.ToString());
                    }
                }
                else if (expression is Alias)
                {
                    Alias alias = (Alias)expression;
                    if ((_scalarVariableName == null) && (alias.Name != null))
                    {
                        _scalarVariableName = alias.Name.Name;
                    }
                }
            }

            foreach (IExpression selectableExpression in expression.Expressions)
            {
                VisitComponent(selectableExpression);
                _commandText.Append(" ");
            }
        }