/// <summary>
 /// Tries to substitute variables within primary expressions
 /// </summary>
 /// <param name="expr">Expression</param>
 /// <returns></returns>
 protected override ISparqlExpression SubstitutePrimaryExpression(ISparqlExpression expr)
 {
     if (expr is VariableTerm)
     {
         if (expr.Variables.First().Equals(this._findVar))
         {
             return(this._replaceExpr);
         }
         else
         {
             return(expr);
         }
     }
     else if (expr is GraphPatternTerm)
     {
         GraphPatternTerm gp  = (GraphPatternTerm)expr;
         ISparqlAlgebra   alg = gp.Pattern.ToAlgebra();
         alg = this.Optimise(alg);
         return(new GraphPatternTerm(alg.ToGraphPattern()));
     }
     else
     {
         return(expr);
     }
 }
예제 #2
0
        /// <summary>
        /// Formats a SPARQL Expression
        /// </summary>
        /// <param name="expr">SPARQL Expression</param>
        /// <returns></returns>
        protected virtual String FormatExpression(ISparqlExpression expr)
        {
            StringBuilder output = new StringBuilder();

            try
            {
                switch (expr.Type)
                {
                case SparqlExpressionType.Aggregate:
                    if (expr is AggregateTerm)
                    {
                        AggregateTerm agg = (AggregateTerm)expr;
                        output.Append(this.FormatAggregate(agg.Aggregate));
                    }
                    else
                    {
                        output.Append(expr.ToString());
                    }
                    break;

                case SparqlExpressionType.BinaryOperator:
                    ISparqlExpression lhs = expr.Arguments.First();
                    ISparqlExpression rhs = expr.Arguments.Skip(1).First();

                    //Format the Expression wrapping the LHS and/or RHS in brackets if required
                    //to ensure that ordering of operators is preserved
                    if (lhs.Type == SparqlExpressionType.BinaryOperator)
                    {
                        output.Append('(');
                        output.Append(this.FormatExpression(lhs));
                        output.Append(')');
                    }
                    else
                    {
                        output.Append(this.FormatExpression(lhs));
                    }
                    output.Append(' ');
                    output.Append(expr.Functor);
                    output.Append(' ');
                    if (rhs.Type == SparqlExpressionType.BinaryOperator)
                    {
                        output.Append('(');
                        output.Append(this.FormatExpression(rhs));
                        output.Append(')');
                    }
                    else
                    {
                        output.Append(this.FormatExpression(rhs));
                    }
                    break;

                case SparqlExpressionType.Function:
                    //Show either a Keyword/URI/QName as appropriate
                    if (SparqlSpecsHelper.IsFunctionKeyword(expr.Functor))
                    {
                        output.Append(expr.Functor);
                    }
                    else
                    {
                        String funcQname;
                        if (this._qnameMapper.ReduceToQName(expr.Functor, out funcQname))
                        {
                            output.Append(funcQname);
                        }
                        else
                        {
                            output.Append('<');
                            output.Append(this.FormatUri(expr.Functor));
                            output.Append('>');
                        }
                    }

                    //Add Arguments list
                    output.Append('(');
                    List <ISparqlExpression> args = expr.Arguments.ToList();
                    for (int i = 0; i < args.Count; i++)
                    {
                        output.Append(this.FormatExpression(args[i]));
                        if (i < args.Count - 1)
                        {
                            output.Append(", ");
                        }
                    }
                    output.Append(')');
                    break;

                case SparqlExpressionType.GraphOperator:
                    output.Append(expr.Functor);
                    output.Append(' ');

                    List <ISparqlExpression> gArgs = expr.Arguments.ToList();
                    if (gArgs.Count > 1)
                    {
                        throw new RdfOutputException("Error Formatting SPARQL Expression - Expressions of type GraphOperator are only allowed a single argument");
                    }
                    for (int i = 0; i < gArgs.Count; i++)
                    {
                        output.Append(this.FormatExpression(gArgs[i]));
                        if (i < gArgs.Count - 1)
                        {
                            output.Append(", ");
                        }
                    }
                    break;

                case SparqlExpressionType.Primary:
                    //If Node/Numeric Term then use Node Formatting otherwise use ToString() on the expression
                    if (expr is ConstantTerm)
                    {
                        ConstantTerm nodeTerm = (ConstantTerm)expr;
                        output.Append(this.Format(nodeTerm.Evaluate(null, 0)));
                    }
                    else if (expr is GraphPatternTerm)
                    {
                        GraphPatternTerm gp = (GraphPatternTerm)expr;
                        output.Append(this.Format(gp.Pattern));
                    }
                    else
                    {
                        output.Append(expr.ToString());
                    }
                    break;

                case SparqlExpressionType.SetOperator:
                    //Add First Argument and Set Operator
                    output.Append(this.FormatExpression(expr.Arguments.First()));
                    output.Append(' ');
                    output.Append(expr.Functor);

                    //Add Set
                    output.Append(" (");
                    List <ISparqlExpression> set = expr.Arguments.Skip(1).ToList();
                    for (int i = 0; i < set.Count; i++)
                    {
                        output.Append(this.FormatExpression(set[i]));
                        if (i < set.Count - 1)
                        {
                            output.Append(", ");
                        }
                    }
                    output.Append(')');
                    break;

                case SparqlExpressionType.UnaryOperator:
                    //Just Functor then Expression
                    output.Append(expr.Functor);
                    output.Append(this.FormatExpression(expr.Arguments.First()));
                    break;
                }
            }
            catch (RdfOutputException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new RdfOutputException("Error formatting a SPARQL Expression - the Expression may have the wrong number of arguments for the reported expression type", ex);
            }

            return(output.ToString());
        }