From 7a06753bdeefa31cff93b92fc62f002d76ef32b1 Mon Sep 17 00:00:00 2001 From: Robert Greiner Date: Mon, 14 Nov 2011 15:17:24 -0600 Subject: [PATCH] Added functionality to find opposite reviews between two users. --- .../Common/FindOppositeReviewsTests.cs | 47 +++++++++++++++++++ .../Common/FindSimilarReviewsTests.cs | 10 ++-- Recommender/Common/FindOppositeReviews.cs | 39 +++++++++++++++ 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 Recommender.Tests/Common/FindOppositeReviewsTests.cs create mode 100644 Recommender/Common/FindOppositeReviews.cs diff --git a/Recommender.Tests/Common/FindOppositeReviewsTests.cs b/Recommender.Tests/Common/FindOppositeReviewsTests.cs new file mode 100644 index 0000000..5ce56bb --- /dev/null +++ b/Recommender.Tests/Common/FindOppositeReviewsTests.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Recommender.Common; +using Recommender.Data; + +namespace Recommender.Tests.Common +{ + [TestFixture] + class FindOppositeReviewsTests + { + + [Test] + public void TwoDistinctReviewersShouldHaveOneOppositeReview() + { + var r1 = ReviewerBuilder.BuildOneReviewMax(); + var r2 = ReviewerBuilder.BuildAReviewerThatReviewedSomethingUnique(); + Assert.AreEqual(1, new FindOppositeReviews(r1.Reviews, r2.Reviews).Calculate().Count); + } + + [Test] + public void ShouldReturnSecondUsersUniqueReview() + { + var r1 = ReviewerBuilder.BuildOneReviewMax(); + var r2 = ReviewerBuilder.BuildAReviewerThatReviewedSomethingUnique(); + Assert.AreEqual("Chess", new FindOppositeReviews(r1.Reviews, r2.Reviews).Calculate().First()); + } + + [Test] + public void ReviewersThatHaveTheExactSameTasteShouldHaveNoOppositeItems() + { + var r1 = ReviewerBuilder.BuildReviewer1(); + var r2 = ReviewerBuilder.BuildReviewer1(); + Assert.AreEqual(0, new FindOppositeReviews(r1.Reviews, r2.Reviews).Calculate().Count); + } + + [Test] + public void ReviewsWithAScoreOfZeroShouldBeIgnored() + { + var r1 = ReviewerBuilder.BuildAReviewerThatReviewedSomethingUnique(); + var invalidReviewer = ReviewerBuilder.BuildReviewerWithInvalidReviews(); + Assert.AreEqual(0, new FindOppositeReviews(r1.Reviews, invalidReviewer.Reviews).Calculate().Count); + } + } +} diff --git a/Recommender.Tests/Common/FindSimilarReviewsTests.cs b/Recommender.Tests/Common/FindSimilarReviewsTests.cs index decd228..9a157ca 100644 --- a/Recommender.Tests/Common/FindSimilarReviewsTests.cs +++ b/Recommender.Tests/Common/FindSimilarReviewsTests.cs @@ -35,16 +35,16 @@ public void ReviewersThatHaveTheSameTasteShouldHaveAllSimilarItems() public void ReviewsWithAScoreOfZeroShouldBeIgnored() { var r1 = ReviewerBuilder.BuildReviewer1(); - var empty = ReviewerBuilder.BuildReviewerWithInvalidReviews(); - Assert.AreEqual(0, new FindSimilarReviews(r1.Reviews, empty.Reviews).Calculate().Count); + var invalidReviewer = ReviewerBuilder.BuildReviewerWithInvalidReviews(); + Assert.AreEqual(0, new FindSimilarReviews(r1.Reviews, invalidReviewer.Reviews).Calculate().Count); } [Test] public void ReviewsWithAScoreOfZeroShouldBeIgnoredSwitchUsers() { - var r1 = ReviewerBuilder.BuildReviewer1(); - var empty = ReviewerBuilder.BuildReviewerWithInvalidReviews(); - Assert.AreEqual(0, new FindSimilarReviews(empty.Reviews, r1.Reviews).Calculate().Count); + var r1 = ReviewerBuilder.BuildAReviewerThatReviewedSomethingUnique(); + var invalidReviewer = ReviewerBuilder.BuildReviewerWithInvalidReviews(); + Assert.AreEqual(0, new FindSimilarReviews(invalidReviewer.Reviews, r1.Reviews).Calculate().Count); } } } diff --git a/Recommender/Common/FindOppositeReviews.cs b/Recommender/Common/FindOppositeReviews.cs new file mode 100644 index 0000000..7fd42f3 --- /dev/null +++ b/Recommender/Common/FindOppositeReviews.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Recommender.Common +{ + public class FindOppositeReviews + { + private readonly Dictionary FirstUserReviews; + private readonly Dictionary SecondUserReviews; + + public FindOppositeReviews(Dictionary firstUserReviews, Dictionary secondUserReviews) + { + FirstUserReviews = firstUserReviews; + SecondUserReviews = secondUserReviews; + } + + public List Calculate() + { + return (from r in SecondUserReviews where ShouldCountReviewAsOpposite(r) select r.Key).ToList(); + } + + private bool ShouldCountReviewAsOpposite(KeyValuePair r) + { + return IsReviewUnique(r) && IsReviewValid(SecondUserReviews[r.Key]); + } + + private static bool IsReviewValid(double value) + { + return value > 0.0; + } + + private bool IsReviewUnique(KeyValuePair r) + { + return !FirstUserReviews.ContainsKey(r.Key); + } + } +}