/// <summary> /// Gets the value of the expression as evaluated in a given Context for a given Binding. /// </summary> /// <param name="context">Evaluation Context.</param> /// <param name="bindingID">Binding ID.</param> /// <returns></returns> public override IValuedNode Evaluate(SparqlEvaluationContext context, int bindingID) { _funcContext = context[SparqlSpecsHelper.SparqlKeywordBNode] as BNodeFunctionContext; if (_funcContext == null) { _funcContext = new BNodeFunctionContext(context.InputMultiset.GetHashCode()); context[SparqlSpecsHelper.SparqlKeywordBNode] = _funcContext; } else if (_funcContext.CurrentInput != context.InputMultiset.GetHashCode()) { // Clear the Context _funcContext.BlankNodes.Clear(); context[SparqlSpecsHelper.SparqlKeywordBNode] = _funcContext; } if (_expr == null) { // If no argument then always a fresh BNode return(_funcContext.Graph.CreateBlankNode().AsValuedNode()); } else { INode temp = _expr.Evaluate(context, bindingID); if (temp != null) { if (temp.NodeType == NodeType.Literal) { ILiteralNode lit = (ILiteralNode)temp; if (lit.DataType == null) { if (lit.Language.Equals(string.Empty)) { if (!_funcContext.BlankNodes.ContainsKey(bindingID)) { _funcContext.BlankNodes.Add(bindingID, new Dictionary <string, INode>()); } if (!_funcContext.BlankNodes[bindingID].ContainsKey(lit.Value)) { _funcContext.BlankNodes[bindingID].Add(lit.Value, _funcContext.Graph.CreateBlankNode()); } return(_funcContext.BlankNodes[bindingID][lit.Value].AsValuedNode()); } else { throw new RdfQueryException("Cannot create a Blank Node when the argument Expression evaluates to a lanuage specified literal"); } } else { throw new RdfQueryException("Cannot create a Blank Node when the argument Expression evaluates to a typed literal node"); } } else { throw new RdfQueryException("Cannot create a Blank Node when the argument Expression evaluates to a non-literal node"); } } else { throw new RdfQueryException("Cannot create a Blank Node when the argument Expression evaluates to null"); } } }
/// <summary> /// Gets the value of the expression as evaluated in a given Context for a given Binding /// </summary> /// <param name="context">Evaluation Context</param> /// <param name="bindingID">Binding ID</param> /// <returns></returns> public override IValuedNode Evaluate(SparqlEvaluationContext context, int bindingID) { this._funcContext = context[SparqlSpecsHelper.SparqlKeywordBNode] as BNodeFunctionContext; if (this._funcContext == null) { this._funcContext = new BNodeFunctionContext(context.InputMultiset.GetHashCode()); context[SparqlSpecsHelper.SparqlKeywordBNode] = this._funcContext; } else if (this._funcContext.CurrentInput != context.InputMultiset.GetHashCode()) { this._funcContext = new BNodeFunctionContext(context.InputMultiset.GetHashCode()); context[SparqlSpecsHelper.SparqlKeywordBNode] = this._funcContext; } if (this._expr == null) { //If no argument then always a fresh BNode return new BlankNode(this._funcContext.Graph, this._funcContext.Mapper.GetNextID()); } else { INode temp = this._expr.Evaluate(context, bindingID); if (temp != null) { if (temp.NodeType == NodeType.Literal) { ILiteralNode lit = (ILiteralNode)temp; if (lit.DataType == null) { if (lit.Language.Equals(string.Empty)) { if (!this._funcContext.BlankNodes.ContainsKey(bindingID)) { this._funcContext.BlankNodes.Add(bindingID, new Dictionary<string, INode>()); } if (!this._funcContext.BlankNodes[bindingID].ContainsKey(lit.Value)) { this._funcContext.BlankNodes[bindingID].Add(lit.Value, new BlankNode(this._funcContext.Graph, this._funcContext.Mapper.GetNextID())); } return this._funcContext.BlankNodes[bindingID][lit.Value].AsValuedNode(); } else { throw new RdfQueryException("Cannot create a Blank Node whne the argument Expression evaluates to a lanuage specified literal"); } } else { throw new RdfQueryException("Cannot create a Blank Node when the argument Expression evaluates to a typed literal node"); } } else { throw new RdfQueryException("Cannot create a Blank Node when the argument Expression evaluates to a non-literal node"); } } else { throw new RdfQueryException("Cannot create a Blank Node when the argument Expression evaluates to null"); } } }