/// <summary> /// Copies a Node using another Node Factory /// </summary> /// <param name="original">Node to copy</param> /// <param name="target">Factory to copy into</param> /// <returns></returns> /// <remarks> /// <para> /// <strong>Warning:</strong> Copying Blank Nodes may lead to unforseen circumstances since no remapping of IDs between Factories is done /// </para> /// </remarks> public static INode CopyNode(INode original, INodeFactory target) { if (ReferenceEquals(original.Graph, target)) return original; switch (original.NodeType) { case NodeType.Blank: return target.CreateBlankNode(((IBlankNode)original).InternalID); case NodeType.GraphLiteral: return target.CreateGraphLiteralNode(((IGraphLiteralNode)original).SubGraph); case NodeType.Literal: ILiteralNode lit = (ILiteralNode)original; if (lit.DataType != null) { return target.CreateLiteralNode(lit.Value, lit.DataType); } else if (!lit.Language.Equals(String.Empty)) { return target.CreateLiteralNode(lit.Value, lit.Language); } else { return target.CreateLiteralNode(lit.Value); } case NodeType.Uri: return target.CreateUriNode(((IUriNode)original).Uri); case NodeType.Variable: return target.CreateVariableNode(((IVariableNode)original).VariableName); default: throw new RdfException("Unable to Copy '" + original.GetType().ToString() + "' Nodes between Node Factories"); } }
/// <summary> /// Creates a Node for the Context /// </summary> /// <param name="n">Node</param> /// <returns></returns> /// <remarks> /// <para> /// In effect all this does is ensure that all Nodes end up in the same Graph which may occassionally not happen otherwise when Graph wrappers are involved /// </para> /// </remarks> public INode GetNode(INode n) { if (_nodeMap == null) { _nodeMap = new MultiDictionary <INode, INode>(new FastVirtualNodeComparer()); } if (_nodeMap.ContainsKey(n)) { return(_nodeMap[n]); } INode temp; switch (n.NodeType) { case NodeType.Blank: temp = GetBlankNode(((IBlankNode)n).InternalID); break; case NodeType.Variable: IVariableNode v = (IVariableNode)n; temp = _factory.CreateVariableNode(v.VariableName); break; case NodeType.GraphLiteral: IGraphLiteralNode g = (IGraphLiteralNode)n; temp = _factory.CreateGraphLiteralNode(g.SubGraph); break; case NodeType.Uri: IUriNode u = (IUriNode)n; temp = _factory.CreateUriNode(u.Uri); break; case NodeType.Literal: ILiteralNode l = (ILiteralNode)n; if (l.DataType != null) { temp = _factory.CreateLiteralNode(l.Value, l.DataType); } else if (!l.Language.Equals(String.Empty)) { temp = _factory.CreateLiteralNode(l.Value, l.Language); } else { temp = _factory.CreateLiteralNode(l.Value); } break; default: throw new RdfQueryException("Cannot construct unknown Node Types"); } _nodeMap.Add(n, temp); return(temp); }
/// <summary> /// Creates a Graph Literal Node /// </summary> /// <returns></returns> public virtual IGraphLiteralNode CreateGraphLiteralNode() { return(_factory.CreateGraphLiteralNode()); }
/// <summary> /// Copies a Node using another Node Factory /// </summary> /// <param name="original">Node to copy</param> /// <param name="target">Factory to copy into</param> /// <returns></returns> /// <remarks> /// <para> /// <strong>Warning:</strong> Copying Blank Nodes may lead to unforseen circumstances since no remapping of IDs between Factories is done /// </para> /// </remarks> public static INode CopyNode(INode original, INodeFactory target) { if (ReferenceEquals(original.Graph, target)) return original; switch (original.NodeType) { case NodeType.Blank: return target.CreateBlankNode(((IBlankNode)original).InternalID); case NodeType.GraphLiteral: return target.CreateGraphLiteralNode(((IGraphLiteralNode)original).SubGraph); case NodeType.Literal: ILiteralNode lit = (ILiteralNode)original; if (lit.DataType != null) { return target.CreateLiteralNode(lit.Value, lit.DataType); } else if (!lit.Language.Equals(String.Empty)) { return target.CreateLiteralNode(lit.Value, lit.Language); } else { return target.CreateLiteralNode(lit.Value); } case NodeType.Uri: return target.CreateUriNode(((IUriNode)original).Uri); case NodeType.Variable: return target.CreateVariableNode(((IVariableNode)original).VariableName); default: throw new RdfException("Unable to Copy '" + original.GetType().ToString() + "' Nodes between Node Factories"); } }