Exemplo n.º 1
0
        /// <summary>
        /// Determines whether two Result Sets are equal.
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        /// <remarks>
        /// Experimental and not yet complete.
        /// </remarks>
        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return(false);
            }

            if (obj is SparqlResultSet results)
            {
                // Must contain same number of Results to be equal
                if (Count != results.Count)
                {
                    return(false);
                }

                // Must have same Boolean result to be equal
                if (Result != results.Result)
                {
                    return(false);
                }

                // Must contain the same set of variables
                if (Variables.Count() != results.Variables.Count())
                {
                    return(false);
                }
                if (!Variables.All(v => results.Variables.Contains(v)))
                {
                    return(false);
                }
                if (results.Variables.Any(v => !_variables.Contains(v)))
                {
                    return(false);
                }

                // If both have no results then they are equal
                if (Count == 0 && results.Count == 0)
                {
                    return(true);
                }

                // All Ground Results from the Result Set must appear in the Other Result Set
                List <SparqlResult> otherResults = results.OrderByDescending(r => r.Variables.Count()).ToList();
                List <SparqlResult> localResults = new List <SparqlResult>();
                int grCount = 0;
                foreach (SparqlResult result in Results.OrderByDescending(r => r.Variables.Count()))
                {
                    if (result.IsGroundResult)
                    {
                        // If a Ground Result in this Result Set is not in the other Result Set we're not equal
                        if (!otherResults.Remove(result))
                        {
                            return(false);
                        }
                        grCount++;
                    }
                    else
                    {
                        localResults.Add(result);
                    }
                }

                // If all the Results were ground results and we've emptied all the Results from the other Result Set
                // then we were equal
                if (Count == grCount && otherResults.Count == 0)
                {
                    return(true);
                }

                // If the Other Results still contains Ground Results we're not equal
                if (otherResults.Any(r => r.IsGroundResult))
                {
                    return(false);
                }

                // Create Graphs of the two sets of non-Ground Results
                SparqlResultSet local = new SparqlResultSet();
                SparqlResultSet other = new SparqlResultSet();
                foreach (String var in _variables)
                {
                    local.AddVariable(var);
                    other.AddVariable(var);
                }
                foreach (SparqlResult r in localResults)
                {
                    local.AddResult(r);
                }
                foreach (SparqlResult r in otherResults)
                {
                    other.AddResult(r);
                }

                // Compare the two Graphs for equality
                SparqlRdfWriter writer = new SparqlRdfWriter();
                IGraph          g      = writer.GenerateOutput(local);
                IGraph          h      = writer.GenerateOutput(other);
                return(g.Equals(h));
            }
            else
            {
                return(false);
            }
        }