     (errors/throw-service-error :invalid-data "You posted empty content")))
 
 (defn get-community-usage-metrics
-  "Retrieves the set of community usage metrics from metadata-db."
+  "Retrieves the current community usage metrics from metadata-db."
   [context]
   (:community-usage-metrics (json/decode (:metadata (humanizer-service/fetch-humanizer-concept context)) true)))
 
+(defn- community-usage-metrics-list->set
+  "Convert list of {:short-name :access-count} maps into a set of short-names."
+  [metrics-list]
+  (set (map :short-name  metrics-list)))
+
 (defn- community-usage-csv->community-usage-metrics
-  "Validate the community usage csv and convert to a list of community usage metrics to save"
-  [context community-usage-csv comprehensive]
-  (let [{:keys [csv-lines product-col version-col hosts-col]} (validate-and-read-csv community-usage-csv)
-        current-metrics (when (= "false" comprehensive)
-                          (get-community-usage-metrics context))]
-    (map #(csv-entry->community-usage-metric context % product-col version-col hosts-col comprehensive current-metrics)
+  "Validate the community usage csv and convert to a list of community usage metrics."
+  [context community-usage-csv current-metrics]
+  (let [{:keys [csv-lines product-col hosts-col]} (validate-and-read-csv community-usage-csv)
+        short-name-cache (new java.util.HashMap)]
+    (map #(csv-entry->community-usage-metric context % product-col hosts-col current-metrics short-name-cache)
          csv-lines)))
 
 (defn- aggregate-usage-metrics
-  "Combine access counts for entries with the same short-name and version number."
+  "Combine access-counts for entries with the same short-name."
   [metrics]
-  ;; name-version-groups is map of [short-name, version] [entries that match short-name/version]
-  (let [name-version-groups (group-by (juxt :short-name :version) metrics)] ; Group by short-name and version
-    ;; The first entry in each list has the short-name and version we want so just add up the access-counts
-    ;; in the rest and add that to the first entry to make the access-counts right
-    (map #(util/remove-nil-keys (assoc (first %) :access-count (reduce + (map :access-count %))))
-         (vals name-version-groups))))
+  (let [count-map (reduce (fn [m {:keys [short-name access-count]}]
+                            (update m short-name (fnil + 0) access-count))
+                          {}
+                          metrics)]
+    (map (fn [[k v]] {:short-name k :access-count v}) count-map)))
 
 (defn- validate-metrics
   "Validate metrics against the JSON schema validation"

  Returns the concept id and revision id of the saved humanizer."
  [context params community-usage-csv]
  (validate-update-community-usage-params params)
  (let [metrics (community-usage-csv->community-usage-metrics context community-usage-csv (:comprehensive params))
        metrics (seq (aggregate-usage-metrics metrics))] ; Combine access-counts for entries with the same version/short-name
    (validate-metrics metrics)
    (humanizer-service/update-humanizers-metadata context :community-usage-metrics metrics)))

   hosts-col - the index of the Hosts in each CSV line"
  [csv-header]
  (let [csv-header (mapv str/trim csv-header)]
    {:product-col (.indexOf csv-header "Product")
     :version-col (.indexOf csv-header "Version")
     :hosts-col (.indexOf csv-header "Hosts")}))

(defn- read-csv-column
  "Read a column from the csv, if the column is exists. Otherwise, return nil."
