Example #1
0
        private ISparqlExpression BuildSparqlFilter(SingleValueNode filterNode, string suffix = "")
        {
            NodeFactory nodeFactory = new NodeFactory();

            if (filterNode.GetType() == typeof(SingleValueFunctionCallNode))
            {
                return(BuildFunctionExpression(filterNode as SingleValueFunctionCallNode));
            }
            else if (filterNode.GetType() == typeof(SingleValuePropertyAccessNode))
            {
                return(new VariableTerm($"?{(filterNode as SingleValuePropertyAccessNode).Property.Name}{suffix}"));
            }
            else if (filterNode.GetType() == typeof(ConstantNode))
            {
                return(new ConstantTerm(CreateLiteralNode(filterNode as ConstantNode)));
            }
            else if (filterNode.GetType() == typeof(ConvertNode))
            {
                var convert = filterNode as ConvertNode;
                if (convert.Source is SingleValueFunctionCallNode)
                {
                    return(BuildSparqlFilter(convert.Source as SingleValueFunctionCallNode, suffix));
                }
                else if (convert.Source is ConstantNode)
                {
                    return(new ConstantTerm(CreateLiteralNode(convert.Source as ConstantNode)));
                }
                else if (convert.Source is SingleValuePropertyAccessNode)
                {
                    var varName = (convert.Source as SingleValuePropertyAccessNode).Property.Name;
                    if (varName.ToLower() == "localid")
                    {
                        var node = LiteralExtensions.ToLiteral(NamespaceUri.ToString().Length + 1, nodeFactory);
                        varName = EdmNodeList[EdmNodeList.Count - 1].Name;
                        return((new UnaryExpressionFilter(
                                    new SubStrFunction(new StrFunction(new VariableTerm($"?{varName}{suffix}")),
                                                       (new ConstantTerm(node))))).Expression);
                    }
                    else
                    {
                        return(new VariableTerm($"?{varName}{suffix}"));
                    }
                }
            }
            else if (filterNode.GetType() == typeof(BinaryOperatorNode))
            {
                var binaryOperator = filterNode as BinaryOperatorNode;
                var left           = BuildSparqlFilter(binaryOperator.Left, suffix);
                var right          = BuildSparqlFilter(binaryOperator.Right, suffix);

                if (binaryOperator.OperatorKind == BinaryOperatorKind.And)
                {
                    return(new AndExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.Or)
                {
                    return(new OrExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.Equal)
                {
                    return(new EqualsExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.NotEqual)
                {
                    return(new NotEqualsExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.GreaterThan)
                {
                    return(new GreaterThanExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.GreaterThanOrEqual)
                {
                    return(new GreaterThanOrEqualToExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.LessThan)
                {
                    return(new LessThanExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.LessThanOrEqual)
                {
                    return(new LessThanOrEqualToExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.Add)
                {
                    return(new AdditionExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.Subtract)
                {
                    return(new SubtractionExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.Divide)
                {
                    return(new DivisionExpression(left, right));
                }
                else if (binaryOperator.OperatorKind == BinaryOperatorKind.Multiply)
                {
                    return(new MultiplicationExpression(left, right));
                }
            }
            else if (filterNode.GetType() == typeof(UnaryOperatorNode))
            {
                var unaryOperator = filterNode as UnaryOperatorNode;
                if (unaryOperator.OperatorKind == UnaryOperatorKind.Not)
                {
                    return(new NotEqualsExpression(BuildSparqlFilter(unaryOperator.Operand, suffix),
                                                   new ConstantTerm(LiteralExtensions.ToLiteral(true, nodeFactory))));
                }
            }
            return(null);
        }