You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by sr...@apache.org on 2009/07/24 16:32:07 UTC

svn commit: r797487 [1/5] - in /lucene/mahout/trunk: core/src/main/java/org/apache/mahout/cf/taste/eval/ core/src/main/java/org/apache/mahout/cf/taste/hadoop/ core/src/main/java/org/apache/mahout/cf/taste/impl/eval/ core/src/main/java/org/apache/mahout...

Author: srowen
Date: Fri Jul 24 14:32:05 2009
New Revision: 797487

URL: http://svn.apache.org/viewvc?rev=797487&view=rev
Log:
MAHOUT-149 and MAHOUT-150

Removed:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/DetailedPreference.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItem.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Item.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/Book.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens/Movie.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixMovie.java
Modified:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/CachingUserNeighborhood.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNUserNeighborhood.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdUserNeighborhood.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/BooleanUserGenericUserBasedRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericRecommendedItem.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/NullRescorer.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/KnnItemBasedRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/MemoryDiffStorage.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/jdbc/AbstractJDBCDiffStorage.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AveragingPreferenceInferrer.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/BooleanLogLikelihoodSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/BooleanTanimotoCoefficientSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/User.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommenderTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommenderTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/MockRecommender.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/NullRescorerTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommenderTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommenderTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/AveragingPreferenceInferrerTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/EuclideanDistanceSimilarityTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarityTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarityTest.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/ejb/RecommenderEJB.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/ejb/RecommenderEJBBean.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/ejb/RecommenderEJBLocal.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingDataModel.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingUser.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens/GroupLensDataModel.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens/GroupLensRecommender.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterDataModel.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommender.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixDataModel.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixFileDataModel.java
    lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixRecommender.java
    lucene/mahout/trunk/taste-web/src/main/java/org/apache/mahout/cf/taste/web/RecommenderServlet.java

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java Fri Jul 24 14:32:05 2009
@@ -19,7 +19,6 @@
 
 import org.apache.mahout.cf.taste.common.TasteException;
 import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.recommender.Rescorer;
 
 /**
@@ -37,14 +36,14 @@
    * @param rescorer           if any, to use when computing recommendations
    * @param at                 as in, "precision at 5". The number of recommendations to consider when evaluating
    *                           precision, etc.
-   * @param relevanceThreshold {@link Item}s whose preference value is at least this value are considered "relevant" for
+   * @param relevanceThreshold items whose preference value is at least this value are considered "relevant" for
    *                           the purposes of computations
    * @return {@link IRStatistics} with resulting precision, recall, etc.
    * @throws TasteException if an error occurs while accessing the {@link DataModel}
    */
   IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
                         DataModel dataModel,
-                        Rescorer<Item> rescorer,
+                        Rescorer<Comparable<?>> rescorer,
                         int at,
                         double relevanceThreshold,
                         double evaluationPercentage) throws TasteException;

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java Fri Jul 24 14:32:05 2009
@@ -18,9 +18,7 @@
 package org.apache.mahout.cf.taste.hadoop;
 
 import org.apache.hadoop.io.Writable;
-import org.apache.mahout.cf.taste.impl.model.GenericItem;
 import org.apache.mahout.cf.taste.impl.recommender.GenericRecommendedItem;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.recommender.RecommendedItem;
 
 import java.io.DataInput;
@@ -53,7 +51,7 @@
   @Override
   public void write(DataOutput out) throws IOException {
     for (RecommendedItem item : recommended) {
-      out.writeUTF(item.getItem().getID().toString());
+      out.writeUTF(item.getItemID().toString());
       out.writeDouble(item.getValue());
     }
 
@@ -66,8 +64,7 @@
       do {
         String itemID = in.readUTF();
         double value = in.readDouble();
-        Item item = new GenericItem<String>(itemID);
-        RecommendedItem recommendedItem = new GenericRecommendedItem(item, value);
+        RecommendedItem recommendedItem = new GenericRecommendedItem(itemID, value);
         recommended.add(recommendedItem);
       } while (true);
     } catch (EOFException eofe) {
@@ -92,7 +89,7 @@
       } else {
         result.append(',');
       }
-      result.append(item.getItem().getID().toString());
+      result.append(item.getItemID().toString());
       result.append(':');
       result.append(item.getValue());
     }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java Fri Jul 24 14:32:05 2009
@@ -98,7 +98,7 @@
     List<Preference> testPrefs = new ArrayList<Preference>();
     Preference[] prefs = user.getPreferencesAsArray();
     for (Preference pref : prefs) {
-      Preference newPref = new GenericPreference(null, pref.getItem(), pref.getValue());
+      Preference newPref = new GenericPreference(null, pref.getItemID(), pref.getValue());
       if (random.nextDouble() < trainingPercentage) {
         trainingPrefs.add(newPref);
       } else {
@@ -108,15 +108,8 @@
     log.debug("Training against {} preferences", trainingPrefs.size());
     log.debug("Evaluating accuracy of {} preferences", testPrefs.size());
     if (!trainingPrefs.isEmpty()) {
-      Object id = user.getID();
-      User trainingUser;
-      if (id instanceof Long) {
-        trainingUser = new GenericUser<Long>((Long) id, trainingPrefs);
-      } else if (id instanceof Integer) {
-        trainingUser = new GenericUser<Integer>((Integer) id, trainingPrefs);
-      } else {
-        trainingUser = new GenericUser<String>(id.toString(), trainingPrefs);
-      }
+      Comparable<?> id = user.getID();
+      User trainingUser = new GenericUser(id, trainingPrefs);
       trainingUsers.add(trainingUser);
       if (!testPrefs.isEmpty()) {
         testUserPrefs.put(trainingUser, testPrefs);

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java Fri Jul 24 14:32:05 2009
@@ -51,7 +51,7 @@
         User testUser = entry.getKey();
         try {
           double estimatedPreference =
-              recommender.estimatePreference(testUser.getID(), realPref.getItem().getID());
+              recommender.estimatePreference(testUser.getID(), realPref.getItemID());
           if (!Double.isNaN(estimatedPreference)) {
             average.addDatum(Math.abs(realPref.getValue() - estimatedPreference));
           }
@@ -60,7 +60,7 @@
           // NSEE will be thrown. Just ignore it and move on.
           log.debug("User exists in test data but not training data: {}", testUser.getID(), nsue);
         } catch (NoSuchItemException nsie) {
-          log.debug("Item exists in test data but not training data: {}", realPref.getItem().getID(), nsie);
+          log.debug("Item exists in test data but not training data: {}", realPref.getItemID(), nsie);
         }
       }
     }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java Fri Jul 24 14:32:05 2009
@@ -34,7 +34,6 @@
 import org.apache.mahout.cf.taste.impl.model.GenericUser;
 import org.apache.mahout.cf.taste.impl.model.GenericBooleanUserDataModel;
 import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 import org.apache.mahout.cf.taste.recommender.RecommendedItem;
@@ -54,7 +53,7 @@
  * <p>For each {@link User}, these implementation determine the top <code>n</code> preferences, then evaluate the IR
  * statistics based on a {@link DataModel} that does not have these values. This number <code>n</code> is the "at"
  * value, as in "precision at 5". For example, this would mean precision evaluated by removing the top 5 preferences for
- * a {@link User} and then finding the percentage of those 5 {@link Item}s included in the top 5 recommendations for
+ * a {@link User} and then finding the percentage of those 5 items included in the top 5 recommendations for
  * that user.</p>
  */
 public final class GenericRecommenderIRStatsEvaluator implements RecommenderIRStatsEvaluator {
@@ -76,7 +75,7 @@
   @Override
   public IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
                                DataModel dataModel,
-                               Rescorer<Item> rescorer,
+                               Rescorer<Comparable<?>> rescorer,
                                int at,
                                double relevanceThreshold,
                                double evaluationPercentage) throws TasteException {
@@ -104,8 +103,8 @@
     for (User user : dataModel.getUsers()) {
       if (random.nextDouble() < evaluationPercentage) {
         long start = System.currentTimeMillis();
-        Object id = user.getID();
-        Collection<Item> relevantItems = new FastSet<Item>(at);
+        Comparable<?> id = user.getID();
+        Collection<Comparable<?>> relevantItemIDs = new FastSet<Comparable<?>>(at);
         Preference[] prefs = user.getPreferencesAsArray();
         if (prefs.length < 2 * at) {
           // Really not enough prefs to meaningfully evaluate this user
@@ -115,17 +114,17 @@
         // List some most-preferred items that would count as (most) "relevant" results
         double theRelevanceThreshold = Double.isNaN(relevanceThreshold) ? computeThreshold(prefs) : relevanceThreshold;
         Arrays.sort(prefs, Collections.reverseOrder(ByValuePreferenceComparator.getInstance()));
-        for (int i = 0; i < prefs.length && relevantItems.size() < at; i++) {
+        for (int i = 0; i < prefs.length && relevantItemIDs.size() < at; i++) {
           Preference pref = prefs[i];
           if (pref.getValue() >= theRelevanceThreshold) {
-            relevantItems.add(pref.getItem());
+            relevantItemIDs.add(pref.getItemID());
           }
         }
-        int numRelevantItems = relevantItems.size();
+        int numRelevantItems = relevantItemIDs.size();
         if (numRelevantItems > 0) {
           List<User> trainingUsers = new ArrayList<User>(dataModel.getNumUsers());
           for (User user2 : dataModel.getUsers()) {
-            processOtherUser(id, relevantItems, trainingUsers, user2);
+            processOtherUser(id, relevantItemIDs, trainingUsers, user2);
           }
 
           DataModel trainingModel;
@@ -145,7 +144,7 @@
           int intersectionSize = 0;
           List<RecommendedItem> recommendedItems = recommender.recommend(id, at, rescorer);
           for (RecommendedItem recommendedItem : recommendedItems) {
-            if (relevantItems.contains(recommendedItem.getItem())) {
+            if (relevantItemIDs.contains(recommendedItem.getItemID())) {
               intersectionSize++;
             }
           }
@@ -171,15 +170,15 @@
     return new IRStatisticsImpl(precision.getAverage(), recall.getAverage(), fallOut.getAverage());
   }
 
-  private static void processOtherUser(Object id,
-                                       Collection<Item> relevantItems,
+  private static void processOtherUser(Comparable<?> id,
+                                       Collection<Comparable<?>> relevantItemIDs,
                                        Collection<User> trainingUsers,
                                        User user2) {
     if (id.equals(user2.getID())) {
       List<Preference> trainingPrefs = new ArrayList<Preference>();
       Preference[] prefs2 = user2.getPreferencesAsArray();
       for (Preference pref : prefs2) {
-        if (!relevantItems.contains(pref.getItem())) {
+        if (!relevantItemIDs.contains(pref.getItemID())) {
           trainingPrefs.add(pref);
         }
       }
@@ -187,25 +186,13 @@
         // TODO hack
         User trainingUser;
         if (user2 instanceof BooleanPrefUser) {
-          FastSet<Object> itemIDs = new FastSet<Object>();
+          FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>();
           for (Preference pref : trainingPrefs) {
-            itemIDs.add(pref.getItem().getID());
-          }
-          if (id instanceof Long) {
-            trainingUser = new BooleanPrefUser<Long>((Long) id, itemIDs);
-          } else if (id instanceof Integer) {
-            trainingUser = new BooleanPrefUser<Integer>((Integer) id, itemIDs);
-          } else {
-            trainingUser = new BooleanPrefUser<String>(id.toString(), itemIDs);
+            itemIDs.add(pref.getItemID());
           }
+          trainingUser = new BooleanPrefUser(id, itemIDs);
         } else {
-          if (id instanceof Long) {
-            trainingUser = new GenericUser<Long>((Long) id, trainingPrefs);
-          } else if (id instanceof Integer) {
-            trainingUser = new GenericUser<Integer>((Integer) id, trainingPrefs);
-          } else {
-            trainingUser = new GenericUser<String>(id.toString(), trainingPrefs);
-          }
+          trainingUser = new GenericUser(id, trainingPrefs);
         }
         trainingUsers.add(trainingUser);
       }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java Fri Jul 24 14:32:05 2009
@@ -49,7 +49,7 @@
         User testUser = entry.getKey();
         try {
           double estimatedPreference =
-              recommender.estimatePreference(testUser.getID(), realPref.getItem().getID());
+              recommender.estimatePreference(testUser.getID(), realPref.getItemID());
           if (!Double.isNaN(estimatedPreference)) {
             double diff = realPref.getValue() - estimatedPreference;
             average.addDatum(diff * diff);

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java Fri Jul 24 14:32:05 2009
@@ -19,7 +19,6 @@
 
 import org.apache.mahout.cf.taste.impl.common.ArrayIterator;
 import org.apache.mahout.cf.taste.impl.common.FastSet;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 
@@ -30,12 +29,12 @@
  * A variant of {@link GenericUser} which is appropriate when users express only a "yes" preference for an item, or none
  * at all. The preference value for all items is considered to be 1.0.
  */
-public class BooleanPrefUser<K extends Comparable<K>> implements User, Serializable {
+public class BooleanPrefUser implements User, Serializable {
 
-  private final K id;
-  private final FastSet<Object> itemIDs;
+  private final Comparable id;
+  private final FastSet<Comparable<?>> itemIDs;
 
-  public BooleanPrefUser(K id, FastSet<Object> itemIDs) {
+  public BooleanPrefUser(Comparable<?> id, FastSet<Comparable<?>> itemIDs) {
     if (id == null || itemIDs == null || itemIDs.isEmpty()) {
       throw new IllegalArgumentException("id or itemIDs is null or empty");
     }
@@ -44,23 +43,23 @@
   }
 
   @Override
-  public K getID() {
+  public Comparable<?> getID() {
     return id;
   }
 
   @Override
-  public Preference getPreferenceFor(Object itemID) {
+  public Preference getPreferenceFor(Comparable<?> itemID) {
     return itemIDs.contains(itemID) ? buildPreference(itemID) : null;
   }
 
   /** Note that the value parameter is ignored; it is as if it were always 1.0. */
   @Override
-  public void setPreference(Item item, double value) {
-    itemIDs.add(item.getID());
+  public void setPreference(Comparable<?> itemID, double value) {
+    itemIDs.add(itemID);
   }
 
   @Override
-  public void removePreference(Object itemID) {
+  public void removePreference(Comparable<?> itemID) {
     itemIDs.remove(itemID);
   }
 
@@ -73,7 +72,7 @@
   public Preference[] getPreferencesAsArray() {
     Preference[] result = new Preference[itemIDs.size()];
     int i = 0;
-    for (Object itemID : itemIDs) {
+    for (Comparable<?> itemID : itemIDs) {
       result[i] = buildPreference(itemID);
       i++;
     }
@@ -81,22 +80,17 @@
     return result;
   }
 
-  private Preference buildPreference(Object itemID) {
-    if (itemID instanceof Long) {
-      return new BooleanPreference(this, new GenericItem<Long>((Long) itemID));
-    } else if (itemID instanceof Integer) {
-      return new BooleanPreference(this, new GenericItem<Integer>((Integer) itemID));
-    }
-    return new BooleanPreference(this, new GenericItem<String>(itemID.toString()));
+  private Preference buildPreference(Comparable<?> itemID) {
+    return new BooleanPreference(this, itemID);
   }
 
   /** @return true iff this user expresses a preference for the given item */
-  public boolean hasPreferenceFor(Object itemID) {
+  public boolean hasPreferenceFor(Comparable<?> itemID) {
     return itemIDs.contains(itemID);
   }
 
   /** @return all item IDs the user expresses a preference for */
-  public FastSet<Object> getItemIDs() {
+  public FastSet<Comparable<?>> getItemIDs() {
     return itemIDs;
   }
 
@@ -118,7 +112,7 @@
   @Override
   @SuppressWarnings("unchecked")
   public int compareTo(User o) {
-    return id.compareTo((K) o.getID());
+    return id.compareTo(o.getID());
   }
 
 }
\ No newline at end of file

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java Fri Jul 24 14:32:05 2009
@@ -17,27 +17,26 @@
 
 package org.apache.mahout.cf.taste.impl.model;
 
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.User;
 
 import java.io.Serializable;
 
 /**
- * Encapsulates a simple boolean "preference" for an {@link Item} whose value does not matter (is fixed at 1.0). This is
+ * Encapsulates a simple boolean "preference" for an item whose value does not matter (is fixed at 1.0). This is
  * appropriate in situations where users conceptually have only a general "yes" preference for items, rather than a
  * spectrum of preference values.
  */
 public final class BooleanPreference implements SettableUserPreference, Serializable {
 
   private User user;
-  private final Item item;
+  private final Comparable<?> itemID;
 
-  public BooleanPreference(User user, Item item) {
-    if (item == null) {
-      throw new IllegalArgumentException("item is null");
+  public BooleanPreference(User user, Comparable<?> itemID) {
+    if (itemID == null) {
+      throw new IllegalArgumentException("itemID is null");
     }
     this.user = user;
-    this.item = item;
+    this.itemID = itemID;
   }
 
   @Override
@@ -57,8 +56,8 @@
   }
 
   @Override
-  public Item getItem() {
-    return item;
+  public Comparable<?> getItemID() {
+    return itemID;
   }
 
   @Override
@@ -73,7 +72,7 @@
 
   @Override
   public String toString() {
-    return "BooleanPreference[user: " + user + ", item:" + item + ']';
+    return "BooleanPreference[user: " + user + ", itemID:" + itemID + ']';
   }
 
 }
\ No newline at end of file

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java Fri Jul 24 14:32:05 2009
@@ -23,8 +23,7 @@
 import java.util.Comparator;
 
 /**
- * <p>{@link java.util.Comparator} that orders {@link org.apache.mahout.cf.taste.model.Preference}s by {@link
- * org.apache.mahout.cf.taste.model.Item}.</p>
+ * <p>{@link java.util.Comparator} that orders {@link org.apache.mahout.cf.taste.model.Preference}s by item.</p>
  */
 public final class ByItemPreferenceComparator implements Comparator<Preference>, Serializable {
 
@@ -40,7 +39,7 @@
 
   @Override
   public int compare(Preference o1, Preference o2) {
-    return o1.getItem().compareTo(o2.getItem());
+    return ((Comparable<Object>) o1.getItemID()).compareTo(o2.getItemID());
   }
 
   @Override

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java Fri Jul 24 14:32:05 2009
@@ -24,7 +24,6 @@
 import org.apache.mahout.cf.taste.impl.common.FastMap;
 import org.apache.mahout.cf.taste.impl.common.FastSet;
 import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 
@@ -42,17 +41,16 @@
 public final class GenericBooleanUserDataModel implements DataModel, Serializable {
 
   private final List<User> users;
-  private final FastMap<Object, User> userMap;
+  private final FastMap<Comparable<?>, User> userMap;
   private final Object[] itemIDs;
-  //private final Set<Object> itemIDSet;
 
   public GenericBooleanUserDataModel(Iterable<? extends User> users) {
     if (users == null) {
       throw new IllegalArgumentException("users is null");
     }
     this.users = new ArrayList<User>(1003);
-    this.userMap = new FastMap<Object, User>(1003);
-    Set<Object> itemIDs = new FastSet<Object>(1003);
+    this.userMap = new FastMap<Comparable<?>, User>(1003);
+    Set<Comparable<?>> itemIDs = new FastSet<Comparable<?>>(1003);
     for (User user : users) {
       if (!(user instanceof BooleanPrefUser)) {
         throw new IllegalArgumentException("Must use a source of BooleanPrefUsers");
@@ -67,8 +65,6 @@
     this.itemIDs = itemIDs.toArray();
     itemIDs = null;
     Arrays.sort(this.itemIDs);
-    //this.itemIDSet = new FastSet<Object>(this.itemIDs.length);
-    //itemIDSet.addAll(Arrays.asList(this.itemIDs));
   }
 
   public GenericBooleanUserDataModel(DataModel dataModel) throws TasteException {
@@ -81,7 +77,7 @@
   }
 
   @Override
-  public User getUser(Object id) throws NoSuchUserException {
+  public User getUser(Comparable<?> id) throws NoSuchUserException {
     User user = userMap.get(id);
     if (user == null) {
       throw new NoSuchUserException();
@@ -90,22 +86,17 @@
   }
 
   @Override
-  public Iterable<? extends Item> getItems() {
+  public Iterable<Comparable<?>> getItemIDs() {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public Item getItem(Object id) throws NoSuchItemException {
+  public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public Iterable<? extends Preference> getPreferencesForItem(Object itemID) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public Preference[] getPreferencesForItemAsArray(Object itemID) {
+  public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) {
     throw new UnsupportedOperationException();
   }
 
@@ -120,7 +111,7 @@
   }
 
   @Override
-  public int getNumUsersWithPreferenceFor(Object... itemIDs) {
+  public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) {
     if (itemIDs == null) {
       throw new IllegalArgumentException("itemIDs is null");
     }
@@ -132,13 +123,13 @@
   }
 
   @Override
-  public void setPreference(Object userID, Object itemID, double value)
+  public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
       throws NoSuchUserException, NoSuchItemException {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public void removePreference(Object userID, Object itemID) throws NoSuchUserException {
+  public void removePreference(Comparable<?> userID, Comparable<?> itemID) throws NoSuchUserException {
     throw new UnsupportedOperationException();
   }
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java Fri Jul 24 14:32:05 2009
@@ -26,7 +26,6 @@
 import org.apache.mahout.cf.taste.impl.common.FastMap;
 import org.apache.mahout.cf.taste.impl.common.FastSet;
 import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 import org.slf4j.Logger;
@@ -54,10 +53,9 @@
   private static final Iterable<Preference> NO_PREFS_ITERABLE = new EmptyIterable<Preference>();
 
   private final List<User> users;
-  private final FastMap<Object, User> userMap;
-  private final List<Item> items;
-  private final FastMap<Object, Item> itemMap;
-  private final FastMap<Object, Preference[]> preferenceForItems;
+  private final FastMap<Comparable<?>, User> userMap;
+  private final List<Comparable<?>> itemIDs;
+  private final FastMap<Comparable<?>, Preference[]> preferenceForItems;
 
   /**
    * <p>Creates a new {@link GenericDataModel} from the given {@link User}s (and their preferences). This {@link
@@ -71,19 +69,18 @@
       throw new IllegalArgumentException("users is null");
     }
 
-    this.userMap = new FastMap<Object, User>();
-    this.itemMap = new FastMap<Object, Item>();
+    this.userMap = new FastMap<Comparable<?>, User>();
     // I'm abusing generics a little here since I want to use this (huge) map to hold Lists,
     // then arrays, and don't want to allocate two Maps at once here.
-    FastMap<Object, Object> prefsForItems = new FastMap<Object, Object>();
+    FastMap<Comparable<?>, Object> prefsForItems = new FastMap<Comparable<?>, Object>();
+    FastSet<Comparable<?>> itemIDSet = new FastSet<Comparable<?>>();
     int currentCount = 0;
     for (User user : users) {
       userMap.put(user.getID(), user);
       Preference[] prefsArray = user.getPreferencesAsArray();
       for (Preference preference : prefsArray) {
-        Item item = preference.getItem();
-        Object itemID = item.getID();
-        itemMap.put(itemID, item);
+        Comparable<?> itemID = preference.getItemID();
+        itemIDSet.add(itemID);
         List<Preference> prefsForItem = (List<Preference>) prefsForItems.get(itemID);
         if (prefsForItem == null) {
           prefsForItem = new ArrayList<Preference>();
@@ -97,19 +94,16 @@
       }
     }
     userMap.rehash();
-    itemMap.rehash();
 
-    List<User> usersCopy = new ArrayList<User>(userMap.values());
-    Collections.sort(usersCopy);
-    this.users = Collections.unmodifiableList(usersCopy);
-
-    List<Item> itemsCopy = new ArrayList<Item>(itemMap.values());
-    Collections.sort(itemsCopy);
-    this.items = Collections.unmodifiableList(itemsCopy);
+    this.users = new ArrayList<User>(userMap.values());
+    Collections.sort(this.users);
+
+    this.itemIDs = new ArrayList<Comparable<?>>(itemIDSet);
+    Collections.sort((List<? extends Comparable>) this.itemIDs);
 
     prefsForItems.rehash();    
     // Swap out lists for arrays here -- using the same Map. This is why the generics mess is worth it.
-    for (Map.Entry<Object, Object> entry : prefsForItems.entrySet()) {
+    for (Map.Entry<Comparable<?>, Object> entry : prefsForItems.entrySet()) {
       List<Preference> list = (List<Preference>) entry.getValue();
       Preference[] prefsAsArray = list.toArray(new Preference[list.size()]);
       Arrays.sort(prefsAsArray, ByUserPreferenceComparator.getInstance());
@@ -117,7 +111,7 @@
     }
 
     // Yeah more generics ugliness
-    this.preferenceForItems = (FastMap<Object, Preference[]>) (FastMap<Object, ?>) prefsForItems;
+    this.preferenceForItems = (FastMap<Comparable<?>, Preference[]>) (FastMap<Comparable<?>, ?>) prefsForItems;
   }
 
   /**
@@ -138,7 +132,7 @@
 
   /** @throws NoSuchUserException if there is no such {@link User} */
   @Override
-  public User getUser(Object id) throws NoSuchUserException {
+  public User getUser(Comparable<?> id) throws NoSuchUserException {
     User user = userMap.get(id);
     if (user == null) {
       throw new NoSuchUserException();
@@ -147,35 +141,25 @@
   }
 
   @Override
-  public Iterable<? extends Item> getItems() {
-    return items;
-  }
-
-  /** @throws NoSuchItemException if there is no such {@link Item} */
-  @Override
-  public Item getItem(Object id) throws NoSuchItemException {
-    Item item = itemMap.get(id);
-    if (item == null) {
-      throw new NoSuchItemException();
-    }
-    return item;
+  public Iterable<Comparable<?>> getItemIDs() {
+    return itemIDs;
   }
 
   @Override
-  public Iterable<? extends Preference> getPreferencesForItem(Object itemID) {
+  public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) {
     Preference[] prefs = preferenceForItems.get(itemID);
     return prefs == null ? NO_PREFS_ITERABLE : new ArrayIterator<Preference>(prefs);
   }
 
   @Override
-  public Preference[] getPreferencesForItemAsArray(Object itemID) {
+  public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) {
     Preference[] prefs = preferenceForItems.get(itemID);
     return prefs == null ? NO_PREFS_ARRAY : prefs;
   }
 
   @Override
   public int getNumItems() {
-    return items.size();
+    return itemIDs.size();
   }
 
   @Override
@@ -184,7 +168,7 @@
   }
 
   @Override
-  public int getNumUsersWithPreferenceFor(Object... itemIDs) {
+  public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) {
     if (itemIDs == null) {
       throw new IllegalArgumentException("itemIDs is null");
     }
@@ -201,11 +185,11 @@
       if (prefs1 == null || prefs2 == null) {
         return 0;
       }
-      Set<Object> users1 = new FastSet<Object>(prefs1.length);
+      Set<Comparable<?>> users1 = new FastSet<Comparable<?>>(prefs1.length);
       for (Preference aPrefs1 : prefs1) {
         users1.add(aPrefs1.getUser().getID());
       }
-      Set<Object> users2 = new FastSet<Object>(prefs2.length);
+      Set<Comparable<?>> users2 = new FastSet<Comparable<?>>(prefs2.length);
       for (Preference aPrefs2 : prefs2) {
         users2.add(aPrefs2.getUser().getID());
       }
@@ -215,13 +199,13 @@
   }
 
   @Override
-  public void setPreference(Object userID, Object itemID, double value)
+  public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
       throws NoSuchUserException, NoSuchItemException {
-    getUser(userID).setPreference(getItem(itemID), value);
+    getUser(userID).setPreference(itemID, value);
   }
 
   @Override
-  public void removePreference(Object userID, Object itemID) throws NoSuchUserException {
+  public void removePreference(Comparable<?> userID, Comparable<?> itemID) throws NoSuchUserException {
     getUser(userID).removePreference(itemID);
   }
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java Fri Jul 24 14:32:05 2009
@@ -17,28 +17,27 @@
 
 package org.apache.mahout.cf.taste.impl.model;
 
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 
 import java.io.Serializable;
 
-/** <p>A simple {@link Preference} encapsulating an {@link Item} and preference value.</p> */
+/** <p>A simple {@link Preference} encapsulating an item and preference value.</p> */
 public class GenericPreference implements SettableUserPreference, Serializable {
 
   private User user;
-  private final Item item;
+  private final Comparable<?> itemID;
   private double value;
 
-  public GenericPreference(User user, Item item, double value) {
-    if (item == null) {
-      throw new IllegalArgumentException("item is null");
+  public GenericPreference(User user, Comparable<?> itemID, double value) {
+    if (itemID == null) {
+      throw new IllegalArgumentException("itemID is null");
     }
     if (Double.isNaN(value)) {
       throw new IllegalArgumentException("Invalid value: " + value);
     }
     this.user = user;
-    this.item = item;
+    this.itemID = itemID;
     this.value = value;
   }
 
@@ -59,8 +58,8 @@
   }
 
   @Override
-  public Item getItem() {
-    return item;
+  public Comparable<?> getItemID() {
+    return itemID;
   }
 
   @Override
@@ -78,7 +77,7 @@
 
   @Override
   public String toString() {
-    return "GenericPreference[user: " + user + ", item:" + item + ", value:" + value + ']';
+    return "GenericPreference[user: " + user + ", itemID:" + itemID + ", value:" + value + ']';
   }
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java Fri Jul 24 14:32:05 2009
@@ -17,7 +17,6 @@
 
 package org.apache.mahout.cf.taste.impl.model;
 
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.PreferenceArray;
 import org.apache.mahout.cf.taste.model.User;
@@ -25,7 +24,7 @@
 import java.io.Serializable;
 
 /**
- * This implementation maintains three parallel arrays, of {@link User}s, {@link Item}s, and values. The idea is to save
+ * This implementation maintains three parallel arrays, of {@link User}s, items, and values. The idea is to save
  * allocating {@link Preference} objects themselves. On a 64-bit virtual machine, this should save 12 bytes per element
  * (the overhead of an enclosing {@link Preference} object reference and object header).
  *
@@ -34,24 +33,24 @@
 public final class GenericPreferenceArray implements PreferenceArray, Serializable {
 
   private final User[] users;
-  private final Item[] items;
+  private final Comparable<?>[] itemIDs;
   private final double[] values;
 
   public GenericPreferenceArray(int size) {
     users = new User[size];
-    items = new Item[size];
+    itemIDs = new Comparable<?>[size];
     values = new double[size];
   }
 
   @Override
   public Preference get(int i) {
-    return new GenericPreference(users[i], items[i], values[i]);
+    return new GenericPreference(users[i], itemIDs[i], values[i]);
   }
 
   @Override
   public void set(int i, Preference pref) {
     users[i] = pref.getUser();
-    items[i] = pref.getItem();
+    itemIDs[i] = pref.getItemID();
     values[i] = pref.getValue();
   }
 
@@ -66,13 +65,13 @@
   }
 
   @Override
-  public Item getItem(int i) {
-    return items[i];
+  public Comparable<?> getItemID(int i) {
+    return itemIDs[i];
   }
 
   @Override
-  public void setItem(int i, Item item) {
-    items[i] = item;
+  public void setItemID(int i, Comparable<?> itemID) {
+    itemIDs[i] = itemID;
   }
 
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java Fri Jul 24 14:32:05 2009
@@ -19,7 +19,6 @@
 
 import org.apache.mahout.cf.taste.impl.common.ArrayIterator;
 import org.apache.mahout.cf.taste.impl.common.FastMap;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 
@@ -31,16 +30,16 @@
 import java.util.Map;
 
 /** <p>A simple {@link User} which has simply an ID and some {@link Collection} of {@link Preference}s.</p> */
-public class GenericUser<K extends Comparable<K>> implements User, Serializable {
+public class GenericUser implements User, Serializable {
 
   private static final Preference[] NO_PREFS = new Preference[0];
 
-  private final K id;
-  private final Map<Object, Preference> data;
+  private final Comparable id;
+  private final Map<Comparable<?>, Preference> data;
   // Use an array for maximum performance
   private Preference[] values;
 
-  public GenericUser(K id, List<Preference> preferences) {
+  public GenericUser(Comparable<?> id, List<Preference> preferences) {
     if (id == null) {
       throw new IllegalArgumentException("id is null");
     }
@@ -49,7 +48,7 @@
       data = Collections.emptyMap();
       values = NO_PREFS;
     } else {
-      data = new FastMap<Object, Preference>();
+      data = new FastMap<Comparable<?>, Preference>();
       int size = preferences.size();
       values = new Preference[size];
       for (int i = 0; i < size; i++) {
@@ -59,25 +58,24 @@
         if (preference instanceof SettableUserPreference) {
           ((SettableUserPreference) preference).setUser(this);
         }
-        data.put(preference.getItem().getID(), preference);
+        data.put(preference.getItemID(), preference);
       }
       Arrays.sort(values, ByItemPreferenceComparator.getInstance());
     }
   }
 
   @Override
-  public K getID() {
+  public Comparable<?> getID() {
     return id;
   }
 
   @Override
-  public Preference getPreferenceFor(Object itemID) {
+  public Preference getPreferenceFor(Comparable<?> itemID) {
     return data.get(itemID);
   }
 
   @Override
-  public void setPreference(Item item, double value) {
-    Object itemID = item.getID();
+  public void setPreference(Comparable<?> itemID, double value) {
     Preference oldPref = data.get(itemID);
     int numValues = values.length;
     if (oldPref == null) {
@@ -85,7 +83,7 @@
       // TODO I am concerned we don't have a good theory about where the factory method
       // belongs for Preference objects in the scheme of things. Should probably live in DataModel.
       // For now we are hard-coding GenericPreference which is usually fine but not really right.
-      Preference preference = new GenericPreference(this, item, value);
+      Preference preference = new GenericPreference(this, itemID, value);
       Preference[] newValues = new Preference[numValues + 1];
       System.arraycopy(values, 0, newValues, 1, numValues);
       newValues[0] = preference;
@@ -99,12 +97,12 @@
   }
 
   @Override
-  public void removePreference(Object itemID) {
+  public void removePreference(Comparable<?> itemID) {
     int numValues = values.length;
     Preference[] newValues = new Preference[numValues - 1];
     for (int i = 0, j = 0; i < numValues; i++, j++) {
       Preference value = values[i];
-      if (value.getItem().getID().equals(itemID)) {
+      if (value.getItemID().equals(itemID)) {
         i++; // skip
       } else {
         newValues[j] = value;
@@ -142,7 +140,7 @@
   @Override
   @SuppressWarnings("unchecked")
   public int compareTo(User o) {
-    return id.compareTo((K) o.getID());
+    return id.compareTo(o.getID());
   }
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java Fri Jul 24 14:32:05 2009
@@ -25,11 +25,9 @@
 import org.apache.mahout.cf.taste.impl.model.BooleanPrefUser;
 import org.apache.mahout.cf.taste.impl.model.BooleanPreference;
 import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
-import org.apache.mahout.cf.taste.impl.model.GenericItem;
 import org.apache.mahout.cf.taste.impl.model.GenericPreference;
 import org.apache.mahout.cf.taste.impl.model.GenericUser;
 import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 import org.slf4j.Logger;
@@ -74,8 +72,8 @@
  * that, a JDBC-backed {@link DataModel} and a database are more appropriate.</p>
  *
  * <p>It is possible and likely useful to subclass this class and customize its behavior to accommodate
- * application-specific needs and input formats. See {@link #processLine(String, Map, Map)}, {@link #buildItem(String)},
- * {@link #buildUser(String, List)} and {@link #buildPreference(User, Item, double)}.</p>
+ * application-specific needs and input formats. See {@link #processLine(String, Map)},
+ * {@link #buildUser(String, List)} and {@link #buildPreference(User, Comparable, double)}.</p>
  */
 public class FileDataModel implements DataModel {
 
@@ -166,7 +164,6 @@
 
   protected void processFile(File dataOrUpdateFile, Map<String, List<Preference>> data) {
     log.info("Reading file info...");
-    Map<String, Item> itemCache = new FastMap<String, Item>(1001);
     AtomicInteger count = new AtomicInteger();
     for (String line : new FileLineIterable(dataOrUpdateFile, false)) {
       if (line.length() > 0) {
@@ -176,7 +173,7 @@
         if (delimiter == UNKNOWN_DELIMITER) {
           delimiter = determineDelimiter(line);
         }
-        processLine(line, data, itemCache);
+        processLine(line, data);
         int currentCount = count.incrementAndGet();
         if (currentCount % 100000 == 0) {
           log.info("Processed {} lines", currentCount);
@@ -202,18 +199,16 @@
    * determining which user and item the preference pertains to, the method should look to see if the data contains a
    * mapping for the user ID already, and if not, add an empty {@link List} of {@link Preference}s to the data.</p>
    *
-   * <p>The method should use {@link #buildItem(String)} to create an {@link Item} representing the item in question if
-   * needed, and use {@link #buildPreference(User, Item, double)} to build {@link Preference} objects as needed.</p>
+   * <p>The method should use {@link #buildPreference(User, Comparable, double)} to
+   * build {@link Preference} objects as needed.</p>
    *
    * <p>Note that if the line is empty or begins with '#' it will be ignored as a comment.</p>
    *
    * @param line      line from input data file
    * @param data      all data read so far, as a mapping from user IDs to preferences
-   * @param itemCache A cache of existing items
-   * @see #buildPreference(User, Item, double)
-   * @see #buildItem(String)
+   * @see #buildPreference(User, Comparable, double)
    */
-  protected void processLine(String line, Map<String, List<Preference>> data, Map<String, Item> itemCache) {
+  protected void processLine(String line, Map<String, List<Preference>> data) {
 
     if (line.length() == 0 || line.charAt(0) == '#') {
       return;
@@ -251,23 +246,18 @@
       Iterator<Preference> prefsIterator = prefs.iterator();
       while (prefsIterator.hasNext()) {
         Preference pref = prefsIterator.next();
-        if (pref.getItem().getID().equals(itemID)) {
+        if (pref.getItemID().equals(itemID)) {
           prefsIterator.remove();
           break;
         }
       }
     } else {
       // add pref -- assume it does not already exist
-      Item item = itemCache.get(itemID);
-      if (item == null) {
-        item = buildItem(itemID);
-        itemCache.put(itemID, item);
-      }
       if (preferenceValueString == null) {
-        prefs.add(new BooleanPreference(null, item));
+        prefs.add(new BooleanPreference(null, itemID));
       } else {
         double preferenceValue = Double.parseDouble(preferenceValueString);
-        prefs.add(buildPreference(null, item, preferenceValue));
+        prefs.add(buildPreference(null, itemID, preferenceValue));
       }
     }
   }
@@ -285,31 +275,25 @@
   }
 
   @Override
-  public User getUser(Object id) throws TasteException {
+  public User getUser(Comparable<?> id) throws TasteException {
     checkLoaded();
     return delegate.getUser(id);
   }
 
   @Override
-  public Iterable<? extends Item> getItems() throws TasteException {
-    checkLoaded();
-    return delegate.getItems();
-  }
-
-  @Override
-  public Item getItem(Object id) throws TasteException {
+  public Iterable<Comparable<?>> getItemIDs() throws TasteException {
     checkLoaded();
-    return delegate.getItem(id);
+    return delegate.getItemIDs();
   }
 
   @Override
-  public Iterable<? extends Preference> getPreferencesForItem(Object itemID) throws TasteException {
+  public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) throws TasteException {
     checkLoaded();
     return delegate.getPreferencesForItem(itemID);
   }
 
   @Override
-  public Preference[] getPreferencesForItemAsArray(Object itemID) throws TasteException {
+  public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) throws TasteException {
     checkLoaded();
     return delegate.getPreferencesForItemAsArray(itemID);
   }
@@ -327,7 +311,7 @@
   }
 
   @Override
-  public int getNumUsersWithPreferenceFor(Object... itemIDs) throws TasteException {
+  public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) throws TasteException {
     checkLoaded();
     return delegate.getNumUsersWithPreferenceFor(itemIDs);
   }
@@ -338,14 +322,14 @@
    * reloaded from a file. This method should also be considered relatively slow.
    */
   @Override
-  public void setPreference(Object userID, Object itemID, double value) throws TasteException {
+  public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value) throws TasteException {
     checkLoaded();
     delegate.setPreference(userID, itemID, value);
   }
 
-  /** See the warning at {@link #setPreference(Object, Object, double)}. */
+  /** See the warning at {@link #setPreference(Comparable, Comparable, double)}. */
   @Override
-  public void removePreference(Object userID, Object itemID) throws TasteException {
+  public void removePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException {
     checkLoaded();
     delegate.removePreference(userID, itemID);
   }
@@ -376,26 +360,14 @@
   protected User buildUser(String id, List<Preference> prefs) {
     if (!prefs.isEmpty() && prefs.get(0) instanceof BooleanPreference) {
       // If first is a BooleanPreference, assuming all are, so, want to use BooleanPrefUser
-      FastSet<Object> itemIDs = new FastSet<Object>(prefs.size());
+      FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>(prefs.size());
       for (Preference pref : prefs) {
-        itemIDs.add(pref.getItem().getID());
+        itemIDs.add(pref.getItemID());
       }
       itemIDs.rehash();
-      return new BooleanPrefUser<String>(id, itemIDs);
+      return new BooleanPrefUser(id, itemIDs);
     }
-    return new GenericUser<String>(id, prefs);
-  }
-
-  /**
-   * Subclasses may override to return a different {@link Item} implementation. The default implementation always builds
-   * a new {@link GenericItem}; likewise it may be better here to return an existing object encapsulating the item
-   * instead.
-   *
-   * @param id item ID
-   * @return {@link GenericItem} by default
-   */
-  protected Item buildItem(String id) {
-    return new GenericItem<String>(id);
+    return new GenericUser(id, prefs);
   }
 
   /**
@@ -403,12 +375,12 @@
    * a new {@link GenericPreference}.
    *
    * @param user  {@link User} who expresses the preference
-   * @param item  preferred {@link Item}
+   * @param itemID  preferred item
    * @param value preference value
    * @return {@link GenericPreference} by default
    */
-  protected Preference buildPreference(User user, Item item, double value) {
-    return new GenericPreference(user, item, value);
+  protected Preference buildPreference(User user, Comparable<?> itemID, double value) {
+    return new GenericPreference(user, itemID, value);
   }
 
   @Override

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -25,7 +25,6 @@
 import org.apache.mahout.cf.taste.impl.common.SkippingIterator;
 import org.apache.mahout.cf.taste.impl.model.BooleanPrefUser;
 import org.apache.mahout.cf.taste.impl.model.BooleanPreference;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 
@@ -59,7 +58,6 @@
                                              String removePreferenceSQL,
                                              String getUsersSQL,
                                              String getItemsSQL,
-                                             String getItemSQL,
                                              String getPrefsForItemSQL,
                                              String getNumPreferenceForItemSQL,
                                              String getNumPreferenceForItemsSQL) {
@@ -75,7 +73,6 @@
         removePreferenceSQL,
         getUsersSQL,
         getItemsSQL,
-        getItemSQL,
         getPrefsForItemSQL,
         getNumPreferenceForItemSQL,
         getNumPreferenceForItemsSQL);
@@ -90,7 +87,7 @@
    *          if there is no such user
    */
   @Override
-  public User getUser(Object id) throws TasteException {
+  public User getUser(Comparable<?> id) throws TasteException {
 
     log.debug("Retrieving user ID '{}'", id);
 
@@ -108,9 +105,9 @@
       log.debug("Executing SQL query: {}", getUserSQL);
       rs = stmt.executeQuery();
 
-      FastSet<Object> itemIDs = new FastSet<Object>();
+      FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>();
       while (rs.next()) {
-        itemIDs.add(rs.getObject(1));
+        itemIDs.add((Comparable<?>) rs.getObject(1));
       }
 
       if (itemIDs.isEmpty()) {
@@ -135,7 +132,7 @@
   }
 
   @Override
-  public void setPreference(Object userID, Object itemID, double value)
+  public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
       throws TasteException {
     if (userID == null || itemID == null) {
       throw new IllegalArgumentException("userID or itemID is null");
@@ -169,9 +166,8 @@
   }
 
   @Override
-  protected List<? extends Preference> doGetPreferencesForItem(Object itemID) throws TasteException {
+  protected List<? extends Preference> doGetPreferencesForItem(Comparable<?> itemID) throws TasteException {
     log.debug("Retrieving preferences for item ID '{}'", itemID);
-    Item item = getItem(itemID, true);
     Connection conn = null;
     PreparedStatement stmt = null;
     ResultSet rs = null;
@@ -186,8 +182,8 @@
       rs = stmt.executeQuery();
       List<Preference> prefs = new ArrayList<Preference>();
       while (rs.next()) {
-        Object userID = rs.getObject(2);
-        Preference pref = buildPreference(buildUser(userID, (FastSet<Object>) null), item);
+        Comparable<?> userID = (Comparable<?>) rs.getObject(2);
+        Preference pref = buildPreference(buildUser(userID, (FastSet<Comparable<?>>) null), itemID);
         prefs.add(pref);
       }
       return prefs;
@@ -199,17 +195,12 @@
     }
   }
 
-  protected User buildUser(Object id, FastSet<Object> itemIDs) {
-    if (id instanceof Long) {
-      return new BooleanPrefUser<Long>((Long) id, itemIDs);
-    } else if (id instanceof Integer) {
-      return new BooleanPrefUser<Integer>((Integer) id, itemIDs);
-    }
-    return new BooleanPrefUser<String>(id.toString(), itemIDs);
+  protected User buildUser(Comparable<?> id, FastSet<Comparable<?>> itemIDs) {
+    return new BooleanPrefUser(id, itemIDs);
   }
 
-  protected Preference buildPreference(User user, Item item) {
-    return new BooleanPreference(user, item);
+  protected Preference buildPreference(User user, Comparable<?> itemID) {
+    return new BooleanPreference(user, itemID);
   }
 
   private final class ResultSetUserIterator implements SkippingIterator<User> {
@@ -262,12 +253,12 @@
         throw new NoSuchElementException();
       }
 
-      Object currentUserID = null;
-      FastSet<Object> itemIDs = new FastSet<Object>();
+      Comparable<?> currentUserID = null;
+      FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>();
 
       try {
         do {
-          Object userID = resultSet.getObject(2);
+          Comparable<?> userID = (Comparable<?>) resultSet.getObject(2);
           if (currentUserID == null) {
             currentUserID = userID;
           }
@@ -276,7 +267,7 @@
             break;
           }
           // else add a new preference for the current user
-          itemIDs.add(resultSet.getObject(1));
+          itemIDs.add((Comparable<?>) resultSet.getObject(1));
         } while (resultSet.next());
       } catch (SQLException sqle) {
         // No good way to handle this since we can't throw an exception
@@ -308,7 +299,7 @@
           int distinctUserNamesSeen = 0;
           Object currentUserID = null;
           do {
-            Object userID = resultSet.getObject(2);
+            Comparable<?> userID = (Comparable<?>) resultSet.getObject(2);
             if (!userID.equals(currentUserID)) {
               distinctUserNamesSeen++;
             }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -26,11 +26,9 @@
 import org.apache.mahout.cf.taste.impl.common.Retriever;
 import org.apache.mahout.cf.taste.impl.common.SkippingIterator;
 import org.apache.mahout.cf.taste.impl.common.jdbc.AbstractJDBCComponent;
-import org.apache.mahout.cf.taste.impl.model.GenericItem;
 import org.apache.mahout.cf.taste.impl.model.GenericPreference;
 import org.apache.mahout.cf.taste.impl.model.GenericUser;
 import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.JDBCDataModel;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
@@ -63,7 +61,7 @@
  *
  * <p>Also note: this default implementation assumes that the user and item ID keys are {@link String}s, for maximum
  * flexibility. You can override this behavior by subclassing an implementation and overriding {@link
- * #buildItem(Object)} and {@link #buildUser(Object, List)}. If you don't, just make sure you use {@link String}s as IDs
+ * {@link #buildUser(Comparable, List)}. If you don't, just make sure you use {@link String}s as IDs
  * throughout your code. If your IDs are really numeric, and you use, say, {@link Long} for IDs in the rest of your
  * code, you will run into subtle problems because the {@link Long} values won't be equal to or compare correctly to the
  * underlying {@link String} key values.</p>
@@ -89,13 +87,12 @@
   private final String removePreferenceSQL;
   private final String getUsersSQL;
   private final String getItemsSQL;
-  private final String getItemSQL;
   private final String getPrefsForItemSQL;
   private final String getNumPreferenceForItemSQL;
   private final String getNumPreferenceForItemsSQL;
   private int cachedNumUsers;
   private int cachedNumItems;
-  private final Cache<Object, Integer> itemPrefCounts;
+  private final Cache<Comparable<?>, Integer> itemPrefCounts;
 
   protected AbstractJDBCDataModel(DataSource dataSource,
                                   String getUserSQL,
@@ -105,7 +102,6 @@
                                   String removePreferenceSQL,
                                   String getUsersSQL,
                                   String getItemsSQL,
-                                  String getItemSQL,
                                   String getPrefsForItemSQL,
                                   String getNumPreferenceForItemSQL,
                                   String getNumPreferenceForItemsSQL) {
@@ -121,7 +117,6 @@
         removePreferenceSQL,
         getUsersSQL,
         getItemsSQL,
-        getItemSQL,
         getPrefsForItemSQL,
         getNumPreferenceForItemSQL,
         getNumPreferenceForItemsSQL);
@@ -139,7 +134,6 @@
                                   String removePreferenceSQL,
                                   String getUsersSQL,
                                   String getItemsSQL,
-                                  String getItemSQL,
                                   String getPrefsForItemSQL,
                                   String getNumPreferenceForItemSQL,
                                   String getNumPreferenceForItemsSQL) {
@@ -159,7 +153,6 @@
     checkNotNullAndLog("removePreferenceSQL", removePreferenceSQL);
     checkNotNullAndLog("getUsersSQL", getUsersSQL);
     checkNotNullAndLog("getItemsSQL", getItemsSQL);
-    checkNotNullAndLog("getItemSQL", getItemSQL);
     checkNotNullAndLog("getPrefsForItemSQL", getPrefsForItemSQL);
     checkNotNullAndLog("getNumPreferenceForItemSQL", getNumPreferenceForItemSQL);
     checkNotNullAndLog("getNumPreferenceForItemsSQL", getNumPreferenceForItemsSQL);
@@ -182,14 +175,13 @@
     this.removePreferenceSQL = removePreferenceSQL;
     this.getUsersSQL = getUsersSQL;
     this.getItemsSQL = getItemsSQL;
-    this.getItemSQL = getItemSQL;
     this.getPrefsForItemSQL = getPrefsForItemSQL;
     this.getNumPreferenceForItemSQL = getNumPreferenceForItemSQL;
     this.getNumPreferenceForItemsSQL = getNumPreferenceForItemsSQL;
 
     this.cachedNumUsers = -1;
     this.cachedNumItems = -1;
-    this.itemPrefCounts = new Cache<Object, Integer>(new ItemPrefCountRetriever(getNumPreferenceForItemSQL));
+    this.itemPrefCounts = new Cache<Comparable<?>, Integer>(new ItemPrefCountRetriever(getNumPreferenceForItemSQL));
 
   }
 
@@ -223,7 +215,7 @@
 
   /** @throws NoSuchUserException if there is no such user */
   @Override
-  public User getUser(Object id) throws TasteException {
+  public User getUser(Comparable<?> id) throws TasteException {
 
     log.debug("Retrieving user ID '{}'", id);
 
@@ -264,63 +256,24 @@
   }
 
   @Override
-  public Iterable<? extends Item> getItems() throws TasteException {
+  public Iterable<Comparable<?>> getItemIDs() throws TasteException {
     log.debug("Retrieving all items...");
-    return new IteratorIterable<Item>(new ResultSetItemIterator(dataSource, getItemsSQL));
+    return new IteratorIterable<Comparable<?>>(new ResultSetItemIterator(dataSource, getItemsSQL));
   }
 
   @Override
-  public Item getItem(Object id) throws TasteException {
-    return getItem(id, false);
-  }
-
-  @Override
-  public Item getItem(Object id, boolean assumeExists) throws TasteException {
-
-    if (assumeExists) {
-      return buildItem((String) id);
-    }
-
-    log.debug("Retrieving item ID '{}'", id);
-
-    Connection conn = null;
-    PreparedStatement stmt = null;
-    ResultSet rs = null;
-
-    try {
-      conn = dataSource.getConnection();
-      stmt = conn.prepareStatement(getItemSQL);
-      stmt.setObject(1, id);
-
-      log.debug("Executing SQL query: {}", getItemSQL);
-      rs = stmt.executeQuery();
-      if (rs.next()) {
-        return buildItem((String) id);
-      } else {
-        throw new NoSuchElementException();
-      }
-    } catch (SQLException sqle) {
-      log.warn("Exception while retrieving item", sqle);
-      throw new TasteException(sqle);
-    } finally {
-      IOUtils.quietClose(rs, stmt, conn);
-    }
-  }
-
-  @Override
-  public Iterable<? extends Preference> getPreferencesForItem(Object itemID) throws TasteException {
+  public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) throws TasteException {
     return doGetPreferencesForItem(itemID);
   }
 
   @Override
-  public Preference[] getPreferencesForItemAsArray(Object itemID) throws TasteException {
+  public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) throws TasteException {
     List<? extends Preference> list = doGetPreferencesForItem(itemID);
     return list.toArray(new Preference[list.size()]);
   }
 
-  protected List<? extends Preference> doGetPreferencesForItem(Object itemID) throws TasteException {
+  protected List<? extends Preference> doGetPreferencesForItem(Comparable<?> itemID) throws TasteException {
     log.debug("Retrieving preferences for item ID '{}'", itemID);
-    Item item = getItem(itemID, true);
     Connection conn = null;
     PreparedStatement stmt = null;
     ResultSet rs = null;
@@ -336,8 +289,8 @@
       List<Preference> prefs = new ArrayList<Preference>();
       while (rs.next()) {
         double preference = rs.getDouble(1);
-        Object userID = rs.getObject(2);
-        Preference pref = buildPreference(buildUser(userID, null), item, preference);
+        Comparable<?> userID = (Comparable<?>) rs.getObject(2);
+        Preference pref = buildPreference(buildUser(userID, null), itemID, preference);
         prefs.add(pref);
       }
       return prefs;
@@ -366,7 +319,7 @@
   }
 
   @Override
-  public int getNumUsersWithPreferenceFor(Object... itemIDs) throws TasteException {
+  public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) throws TasteException {
     if (itemIDs == null) {
       throw new IllegalArgumentException("itemIDs is null");
     }
@@ -408,7 +361,7 @@
   }
 
   @Override
-  public void setPreference(Object userID, Object itemID, double value)
+  public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
       throws TasteException {
     if (userID == null || itemID == null) {
       throw new IllegalArgumentException("userID or itemID is null");
@@ -444,7 +397,7 @@
   }
 
   @Override
-  public void removePreference(Object userID, Object itemID)
+  public void removePreference(Comparable<?> userID, Comparable<?> itemID)
       throws TasteException {
     if (userID == null || itemID == null) {
       throw new IllegalArgumentException("userID or itemID is null");
@@ -482,9 +435,9 @@
 
   private void addPreference(ResultSet rs, Collection<Preference> prefs)
       throws SQLException {
-    Item item = buildItem(rs.getObject(1));
+    Comparable<?> itemID = (Comparable<?>) rs.getObject(1);
     double preferenceValue = rs.getDouble(2);
-    prefs.add(buildPreference(null, item, preferenceValue));
+    prefs.add(buildPreference(null, itemID, preferenceValue));
   }
 
   /**
@@ -495,41 +448,19 @@
    * @param prefs user preferences
    * @return {@link GenericUser} by default
    */
-  protected User buildUser(Object id, List<Preference> prefs) {
-    // ugly
-    if (id instanceof Long) {
-      return new GenericUser<Long>((Long) id, prefs);
-    } else if (id instanceof Integer) {
-      return new GenericUser<Integer>((Integer) id, prefs);
-    }
-    return new GenericUser<String>(id.toString(), prefs);
-  }
-
-  /**
-   * <p>Default implementation which returns a new {@link GenericItem} with {@link String} IDs. Subclasses may override
-   * to return a different {@link Item} implementation.</p>
-   *
-   * @param id item ID
-   * @return {@link GenericItem} by default
-   */
-  protected Item buildItem(Object id) {
-    if (id instanceof Long) {
-      return new GenericItem<Long>((Long) id);
-    } else if (id instanceof Integer) {
-      return new GenericItem<Integer>((Integer) id);
-    }
-    return new GenericItem<String>(id.toString());
+  protected User buildUser(Comparable<?> id, List<Preference> prefs) {
+    return new GenericUser(id, prefs);
   }
 
   /**
    * Subclasses may override to return a different {@link Preference} implementation.
    *
    * @param user {@link User}
-   * @param item {@link Item}
+   * @param itemID item ID
    * @return {@link GenericPreference} by default
    */
-  protected Preference buildPreference(User user, Item item, double value) {
-    return new GenericPreference(user, item, value);
+  protected Preference buildPreference(User user, Comparable<?> itemID, double value) {
+    return new GenericPreference(user, itemID, value);
   }
 
   /**
@@ -589,12 +520,12 @@
         throw new NoSuchElementException();
       }
 
-      Object currentUserID = null;
+      Comparable<?> currentUserID = null;
       List<Preference> prefs = new ArrayList<Preference>();
 
       try {
         do {
-          Object userID = resultSet.getObject(3);
+          Comparable<?> userID = (Comparable<?>) resultSet.getObject(3);
           if (currentUserID == null) {
             currentUserID = userID;
           }
@@ -635,7 +566,7 @@
           int distinctUserNamesSeen = 0;
           Object currentUserID = null;
           do {
-            Object userID = resultSet.getObject(3);
+            Comparable<?> userID = (Comparable<?>) resultSet.getObject(3);
             if (!userID.equals(currentUserID)) {
               distinctUserNamesSeen++;
             }
@@ -651,13 +582,13 @@
   }
 
   /**
-   * <p>An {@link java.util.Iterator} which returns {@link org.apache.mahout.cf.taste.model.Item}s from a {@link
+   * <p>An {@link java.util.Iterator} which returns items from a {@link
    * java.sql.ResultSet}. This is a useful way to iterate over all user data since it does not require all data to be
    * read into memory at once. It does however require that the DB connection be held open. Note that this class will
    * only release database resources after {@link #hasNext()} has been called and has returned <code>false</code>;
    * callers should make sure to "drain" the entire set of data to avoid tying up database resources.</p>
    */
-  private final class ResultSetItemIterator implements SkippingIterator<Item> {
+  private final class ResultSetItemIterator implements SkippingIterator<Comparable<?>> {
 
     private final Connection connection;
     private final Statement statement;
@@ -701,16 +632,16 @@
     }
 
     @Override
-    public Item next() {
+    public Comparable<?> next() {
 
       if (!hasNext()) {
         throw new NoSuchElementException();
       }
 
       try {
-        Item item = buildItem(resultSet.getObject(1));
+        Comparable<?> itemID = (Comparable<?>) resultSet.getObject(1);
         resultSet.next();
-        return item;
+        return itemID;
       } catch (SQLException sqle) {
         // No good way to handle this since we can't throw an exception
         log.warn("Exception while iterating over items", sqle);
@@ -747,7 +678,7 @@
 
   }
 
-  private class ItemPrefCountRetriever implements Retriever<Object, Integer> {
+  private class ItemPrefCountRetriever implements Retriever<Comparable<?>, Integer> {
     private final String getNumPreferenceForItemSQL;
 
     private ItemPrefCountRetriever(String getNumPreferenceForItemSQL) {
@@ -755,7 +686,7 @@
     }
 
     @Override
-    public Integer get(Object key) throws TasteException {
+    public Integer get(Comparable<?> key) throws TasteException {
       return getNumThings("user preferring item", getNumPreferenceForItemSQL, key);
     }
   }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -45,7 +45,6 @@
   public static final String REMOVE_PREFERENCE_SQL_KEY = "removePreferenceSQL";
   public static final String GET_USERS_SQL_KEY = "getUsersSQL";
   public static final String GET_ITEMS_SQL_KEY = "getItemsSQL";
-  public static final String GET_ITEM_SQL_KEY = "getItemSQL";
   public static final String GET_PREFS_FOR_ITEM_SQL_KEY = "getPrefsForItemSQL";
   public static final String GET_NUM_PREFERENCE_FOR_ITEM_KEY = "getNumPreferenceForItemSQL";
   public static final String GET_NUM_PREFERENCE_FOR_ITEMS_KEY = "getNumPreferenceForItemsSQL";
@@ -66,7 +65,6 @@
         props.getProperty(REMOVE_PREFERENCE_SQL_KEY),
         props.getProperty(GET_USERS_SQL_KEY),
         props.getProperty(GET_ITEMS_SQL_KEY),
-        props.getProperty(GET_ITEM_SQL_KEY),
         props.getProperty(GET_PREFS_FOR_ITEM_SQL_KEY),
         props.getProperty(GET_NUM_PREFERENCE_FOR_ITEM_KEY),
         props.getProperty(GET_NUM_PREFERENCE_FOR_ITEMS_KEY));

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -111,8 +111,6 @@
         "SELECT " + itemIDColumn + ", " + userIDColumn + " FROM " + preferenceTable + " ORDER BY " + userIDColumn,
         // getItemsSQL
         "SELECT DISTINCT " + itemIDColumn + " FROM " + preferenceTable + " ORDER BY " + itemIDColumn,
-        // getItemSQL
-        "SELECT 1 FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?",
         // getPrefsForItemSQL
         "SELECT " + userIDColumn + " FROM " +
             preferenceTable + " WHERE " + itemIDColumn + "=? ORDER BY " + userIDColumn,

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -162,8 +162,6 @@
             preferenceTable + " ORDER BY " + userIDColumn + ", " + itemIDColumn,
         // getItemsSQL
         "SELECT DISTINCT " + itemIDColumn + " FROM " + preferenceTable + " ORDER BY " + itemIDColumn,
-        // getItemSQL
-        "SELECT 1 FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?",
         // getPrefsForItemSQL
         "SELECT " + preferenceColumn + ", " + userIDColumn + " FROM " +
             preferenceTable + " WHERE " + itemIDColumn + "=? ORDER BY " + userIDColumn,