/// <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); } }
/// <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()); }