Example #1
0
        public void CalculateScoreForProduct(int productUID, string database)
        {
            Product initialProduct = db.GetProduct(productUID, database).Result;

            if (initialProduct != null)
            {
                Dictionary <int, double> productScores = new Dictionary <int, double>();
                BsonArray visitors = db.GetVisitorsForProduct(productUID, database).Result;
                foreach (BsonString visitorId in visitors.Values)
                {
                    List <int> visitorProducts = db.GetVisitorProducts(visitorId.AsString, database).Result;
                    if (visitorProducts != null)
                    {
                        foreach (int product in visitorProducts)
                        {
                            if (productScores.Keys.Contains(product))
                            {
                                productScores[product]++;
                            }
                            else
                            {
                                productScores.Add(product, 1);
                            }
                        }
                    }
                }
                Dictionary <int, double> sortedScores = CountAndSortBehavior(productScores);

                if (sortedScores.Count > 100)
                {
                    //Only calculate top 100 product scores
                    for (int i = 0; i < 100; i++)
                    {
                        int     productId      = sortedScores.ElementAt(i).Key;
                        Product compareProduct = db.GetProduct(productId, database).Result;
                        sortedScores[productId] = CalculateSimilarityScore(initialProduct, compareProduct, sortedScores[productId]);
                    }
                }
                else
                {
                    foreach (int productId in productScores.Keys)
                    {
                        Product compareProduct = db.GetProduct(productId, database).Result;
                        sortedScores[productId] = CalculateSimilarityScore(initialProduct, compareProduct, sortedScores[productId]);
                    }
                }

                sortedScores = CountAndSortBehavior(sortedScores);
                Dictionary <int, double> top10ProductsAndScores = sortedScores.Take(10).ToDictionary(pair => pair.Key, pair => pair.Value);

                db.InsertScore(initialProduct.ProductUID, top10ProductsAndScores, database);

                Debug.WriteLine("Product " + initialProduct.ProductUID + " updated");
            }
        }