/// <summary> /// Compares this Node to another Node /// </summary> /// <param name="other">Other Node</param> /// <returns></returns> /// <remarks> /// Unless Virtual Equality (equality based on the Virtual RDF Provider and Virtual ID) can be determined or the Nodes are of different types then the Nodes value will have to be materialised in order to perform comparison. /// </remarks> public int CompareTo(INode other) { if (ReferenceEquals(this, other)) { return(0); } if (other == null) { return(1); } bool areEqual; if (this.TryVirtualEquality(other, out areEqual) && areEqual) { return(0); } MaterialiseValue(); switch (this._value.NodeType) { case NodeType.Blank: if (other.NodeType == NodeType.Variable) { //Blank Nodes are greater than variables return(1); } else if (other.NodeType == NodeType.Blank) { //Compare Blank Node appropriately return(ComparisonHelper.CompareBlankNodes((IBlankNode)this, (IBlankNode)other)); } else { //Blank Nodes are less than everything else return(-1); } case NodeType.GraphLiteral: if (other.NodeType == NodeType.GraphLiteral) { //Compare Graph Literals appropriately return(ComparisonHelper.CompareGraphLiterals((IGraphLiteralNode)this, (IGraphLiteralNode)other)); } else { //Graph Literals are greater than everything else return(1); } case NodeType.Literal: if (other.NodeType == NodeType.GraphLiteral) { //Literals are less than Graph Literals return(-1); } else if (other.NodeType == NodeType.Literal) { //Compare Literals appropriately return(ComparisonHelper.CompareLiterals((ILiteralNode)this, (ILiteralNode)other)); } else { //Literals are greater than anything else (i.e. Blanks, Variables and URIs) return(1); } case NodeType.Uri: if (other.NodeType == NodeType.GraphLiteral || other.NodeType == NodeType.Literal) { //URIs are less than Literals and Graph Literals return(-1); } else if (other.NodeType == NodeType.Uri) { //Compare URIs appropriately return(ComparisonHelper.CompareUris((IUriNode)this, (IUriNode)other)); } else { //URIs are greater than anything else (i.e. Blanks and Variables) return(1); } case NodeType.Variable: if (other.NodeType == NodeType.Variable) { //Compare Variables accordingly return(ComparisonHelper.CompareVariables((IVariableNode)this, (IVariableNode)other)); } else { //Variables are less than anything else return(-1); } default: //Things are always greater than unknown node types return(1); } }