Exemple #1
0
        public override void VisitJoinClause(Remotion.Linq.Clauses.JoinClause joinClause, QueryModel queryModel, int index)
        {
            _isInstanceQuery = false;
            _queryBuilder.AddFromPart(joinClause);
            var inner = SparqlGeneratorWhereExpressionTreeVisitor.GetSparqlExpression(joinClause.InnerKeySelector, _queryBuilder);
            var outer = SparqlGeneratorWhereExpressionTreeVisitor.GetSparqlExpression(joinClause.OuterKeySelector, _queryBuilder);

            if (inner is SelectVariableNameExpression && outer is SelectVariableNameExpression)
            {
                var innerVar = inner as SelectVariableNameExpression;
                var outerVar = outer as SelectVariableNameExpression;
                if (innerVar.BindingType == VariableBindingType.Literal ||
                    outerVar.BindingType == VariableBindingType.Literal)
                {
                    _queryBuilder.AddFilterExpression(string.Format("(?{0}=?{1})", innerVar.Name, outerVar.Name));
                }
                else
                {
                    _queryBuilder.AddFilterExpression(string.Format("(sameTerm(?{0}, ?{1}))", innerVar.Name, outerVar.Name));
                }
            }
            else
            {
                throw new NotSupportedException(
                          String.Format("No support for joining expressions of type {0} and {1}", inner.NodeType,
                                        outer.NodeType));
            }
        }
Exemple #2
0
        public static Expression GetSparqlExpression(Expression expression, SparqlQueryBuilder queryBuilder)
        {
            var visitor            = new SparqlGeneratorWhereExpressionTreeVisitor(queryBuilder);
            var returnedExpression = visitor.VisitExpression(expression);

            if (returnedExpression is SelectVariableNameExpression && expression.Type.Equals(typeof(bool)))
            {
                var svn = (SelectVariableNameExpression)returnedExpression;
                // Single boolean member expression requires a special case addition to the filter
                queryBuilder.AddFilterExpression("(?" + svn.Name + " = true)");
            }
            queryBuilder.AddFilterExpression(visitor.FilterExpression);
            return(returnedExpression);
        }
        public static Expression GetSparqlExpression(Expression expression, SparqlQueryBuilder queryBuilder, bool filterOptimizationEnabled)
        {
            var canOptimizeFilter  = filterOptimizationEnabled && CanOptimizeFilter(expression, queryBuilder);
            var visitor            = new SparqlGeneratorWhereExpressionTreeVisitor(queryBuilder, canOptimizeFilter, expression.Type == typeof(bool));
            var returnedExpression = visitor.VisitExpression(expression);
            var svn = returnedExpression as SelectVariableNameExpression;

            if (svn != null && expression.Type == typeof(bool))
            {
                // Single boolean member expression requires a special case addition to the filter
                queryBuilder.AddFilterExpression("(?" + svn.Name + " = true)");
            }
            queryBuilder.AddFilterExpression(visitor.FilterExpression);
            return(returnedExpression);
        }
        protected bool HandleAddressOrIdEquals(Expression left, Expression right)
        {
            string       itemName     = null;
            PropertyHint propertyHint = GetPropertyHint(left);

            if (propertyHint == null ||
                !(propertyHint.MappingType == PropertyMappingType.Address ||
                  propertyHint.MappingType == PropertyMappingType.Id))
            {
                return(false);
            }
            if (left is SelectVariableNameExpression)
            {
                itemName = (left as SelectVariableNameExpression).Name;
            }
            else if (left is MemberExpression)
            {
                var m = left as MemberExpression;
                if (m.Expression is QuerySourceReferenceExpression)
                {
                    itemName = (m.Expression as QuerySourceReferenceExpression).ReferencedQuerySource.ItemName;
                }
                else
                {
                    var visitResult = VisitMemberExpression(m);
                    if (visitResult is SelectVariableNameExpression)
                    {
                        itemName = (visitResult as SelectVariableNameExpression).Name;
                    }
                }
            }
            if (itemName == null)
            {
                return(false);
            }
            var constantExpression = right as ConstantExpression;

            if (constantExpression == null)
            {
                return(false);
            }
            string address = null;

            if (propertyHint.MappingType == PropertyMappingType.Id)
            {
                address = MakeResourceAddress(GetPropertyInfo(left), constantExpression.Value.ToString());
            }
            else if (propertyHint.MappingType == PropertyMappingType.Address)
            {
                address = constantExpression.Value.ToString();
            }
            if (address != null)
            {
                if (QueryBuilder.SelectVariables.Contains(itemName))
                {
                    QueryBuilder.AddFilterExpression(String.Format("(?{0}=<{1}>)", itemName, address));
                }
                else
                {
                    QueryBuilder.ConvertVariableToConstantUri(itemName, address);
                }
                return(true);
            }
            return(false);
        }