}// End method isNumbersLetters()

        public static string genersToList(EntitySet <MovieGenre> geners)
        {
            ImdbDataClassDataContext context = new ImdbDataClassDataContext();
            StringBuilder            add     = new StringBuilder();

            foreach (var item in geners)
            {
                if (item != geners.Last())
                {
                    add.Append(context.Genres.First(g => g.genreId == item.genreId).genreName + ", ");
                }
                else
                {
                    add.Append(context.Genres.First(g => g.genreId == item.genreId).genreName);
                }
            }
            return(add.ToString());
        }// End method genersToList()
        }// End method mostWatchedMovies()

        public static IQueryable mostPopularMovies(String userName)
        {
            ImdbDataClassDataContext context = new ImdbDataClassDataContext();
            //var result = (from u in context.UserMovieRanks
            //              where u.TwitterUser.userName != userName
            //              group new { u.Movie, u } by new
            //              {
            //                  u.Movie.movieId,
            //                  u.Movie.movieName,
            //                  u.Movie.publishYear
            //              } into g
            //              orderby
            //                (double?)g.Average(p => p.u.movieRank) descending
            //              select new
            //              {
            //                  ID = g.Key.movieId,
            //                  Name = g.Key.movieName,
            //                  Year = g.Key.publishYear,
            //                  AverageRank = (double?)g.Average(p => p.u.movieRank),
            //                  //Genres =
            //                  Trailer = "Watch trailer..."
            //              }).Take(5);

            var result = (from movie in context.Movies
                          where !(from u in movie.UserMovieRanks select u.TwitterUser.userName).Contains(userName)
                          orderby movie.UserMovieRanks.Average(a => a.movieRank) descending
                          select new
            {
                ID = movie.movieId,
                Name = movie.movieName,
                Year = movie.publishYear,
                Genres = genersToList(movie.MovieGenres),
                AverageRank = movie.UserMovieRanks.Average(a => a.movieRank),
                Trailer = "Watch trailer..."
            }).Take(5);

            return(result);
        }// End method mostPopularMovies()
        }// End method UsersWithSimilarTastes()

        public static IQueryable userGenrePreferences(String userName)
        {
            ImdbDataClassDataContext context = new ImdbDataClassDataContext();

            //query to get the selected userId from userName
            var param_user = (from user in context.TwitterUsers
                              where user.userName == userName
                              select user.userId);

            //return the movie's ids the the user didnt watch
            var movies = from UserMovieRanks in context.UserMovieRanks
                         where
                         UserMovieRanks.userId != param_user.First() &&
                         (from MovieGenres in context.MovieGenres
                          where
                          ((from ranks in context.UserMovieRanks
                            join g in context.MovieGenres on ranks.movieId equals g.movieId
                            where
                            ranks.userId == param_user.First()
                            group g by new
            {
                g.genreId
            } into g
                            orderby
                            g.Count(p => p.genreId != null) descending
                            select new
            {
                g.Key.genreId
            }).Take(1)).Contains(new { genreId = MovieGenres.genreId })
                          select new
            {
                MovieGenres.movieId
            }).Contains(new { movieId = UserMovieRanks.movieId })
                         group UserMovieRanks by new
            {
                UserMovieRanks.movieId
            } into g
            orderby
            g.Average(p => p.movieRank) descending
            select new
            {
                g.Key.movieId,
                avg_rank = (double?)g.Average(p => p.movieRank)
            };

            //the sql for this query
            //select movieid from usermovierank where userid<>1 and movieid in
            //(
            //select movieid from MovieGenre where genreId in
            //(
            //select top 1 g.genreId from usermovierank ranks
            //inner join moviegenre g on ranks.movieid=g.movieid
            //where userid=1
            //group by g.genreId
            //order by count(g.genreId) desc
            //)
            //)
            //group by movieId
            //order by avg(movierank) desc


            //joins the ids with the movies table to get the movies information for display
            var result = from item in movies
                         join original_movies in context.Movies on item.movieId equals original_movies.movieId
                         select new
            {
                ID           = original_movies.movieId,
                Name         = original_movies.movieName,
                Year         = original_movies.publishYear,
                Genres       = genersToList(original_movies.MovieGenres),
                Average_Rank = item.avg_rank,
                Trailer      = "Watch trailer..."
            };


            return(result);
        }// End method UserGenrePreferences()
        public static void initiateDataFromFile(string folderPath)
        {
            string        tempUserId = "";
            TwitterUser   user;
            UserMovieRank movieRank;
            Genre         genre;
            Movie         movie;
            MovieGenre    movieGenre;
            //List<Genre> genresList = new List<Genre>();


            Dictionary <string, TwitterUser> userDir = new Dictionary <string, TwitterUser>();
            ImdbDataClassDataContext         context = new ImdbDataClassDataContext();

            foreach (string file in Directory.EnumerateFiles(folderPath, "*.txt"))
            {
                //read all user txt files and parse to TwitterUser objects
                if (Path.GetFileName(file).Contains("user"))
                {
                    user = new TwitterUser();
                    var userSp = File.ReadAllText(file).Split(':', '\n');
                    // set TwitterUser object properties
                    for (int i = 0; i < userSp.Length; i++)
                    {
                        if (userSp[i].Equals("TwitterId"))
                        {
                            tempUserId = userSp[i + 1].Trim();// save temp id to Match movies txt file id
                        }
                        else if (userSp[i].Equals("ScreenName"))
                        {
                            user.userName = userSp[i + 1].Trim();// set TwitterUser object Name property
                        }
                        else if (userSp[i].Equals("FollowersNumber"))
                        {
                            user.followNum = Convert.ToInt16(userSp[i + 1].Trim());// set TwitterUser object FollowersNumber property
                        }
                    }
                    context.TwitterUsers.InsertOnSubmit(user);
                    userDir.Add(tempUserId, user);// Dictionary (like Java's HashMap) holeds (key, value) set
                }
            } // End foreach statement

            context.SubmitChanges();

            //foreach Dictionary key ID open movie file with the same ID ~ for example ID 1 will open C:\MyDir\...\movies_1.txt file
            foreach (string userKey in userDir.Keys)
            {
                string filePath = folderPath + @"\movies_" + userKey + ".txt";

                if (File.Exists(filePath))// check if file Exists
                {
                    // Split file to lines <~ NOTE each line represents Movie object ~>
                    var movieLine = File.ReadAllText(filePath).Split('\n');

                    foreach (var line in movieLine)
                    {
                        movieRank = new UserMovieRank();

                        if (line.Length > 0)
                        {
                            var matcheName = Regex.Match(line, "(?<=\\d\\s)([\\D]+).*(?=\\s+\\()");

                            if (!context.Movies.Any(m => m.movieName == matcheName.ToString()))
                            {
                                movie           = new Movie();
                                movie.movieName = matcheName.ToString();

                                var matcheRank = Regex.Match(line, "(?<=\\d\\s)([\\d]+)");
                                movieRank.movieRank = Convert.ToByte(matcheRank.ToString());

                                var matcheYear = Regex.Match(line, "(?<=\\().+?(?=\\))");
                                movie.publishYear = Convert.ToInt16(matcheYear.ToString());

                                var matcheGenres = Regex.Matches(line, "(((?<=\\::)|(?<=\\|))([\\w]+)((?<=\\S)|(?<=\\|)))");
                                var genresResult = String.Join(" ", matcheGenres.Cast <Match>().Select(m => m.Value)).Split(' ');

                                //foreach Genre in genresResult create a new Genre object and add it to MovieGenre
                                foreach (string gen in genresResult)
                                {
                                    if (!context.Genres.Any(g => g.genreName == gen))
                                    {
                                        genre            = new Genre();
                                        genre.genreName  = gen;
                                        movieGenre       = new MovieGenre();
                                        movieGenre.Genre = genre;
                                        movieGenre.Movie = movie;
                                        movie.MovieGenres.Add(movieGenre);
                                        context.Genres.InsertOnSubmit(genre);
                                        context.MovieGenres.InsertOnSubmit(movieGenre);
                                    }
                                    else
                                    {
                                        movieGenre       = new MovieGenre();
                                        movieGenre.Genre = context.Genres.First(d => d.genreName == gen);
                                        movieGenre.Movie = movie;
                                        movie.MovieGenres.Add(movieGenre);
                                        context.MovieGenres.InsertOnSubmit(movieGenre);
                                    }
                                }// End foreach statement

                                movieRank.Movie       = movie;
                                movieRank.TwitterUser = userDir[userKey];
                                context.Movies.InsertOnSubmit(movie);
                                context.UserMovieRanks.InsertOnSubmit(movieRank);
                                try
                                {
                                    context.SubmitChanges();
                                }
                                catch (Exception e)
                                {
                                    Debug.WriteLine(e.ToString());
                                }
                            }
                            else
                            {
                                var matcheRank = Regex.Match(line, "(?<=\\d\\s)([\\d]+)");
                                movieRank.movieRank = Convert.ToByte(matcheRank.ToString());

                                movieRank.Movie       = context.Movies.First(n => n.movieName == matcheName.ToString());;
                                movieRank.TwitterUser = userDir[userKey];
                                context.UserMovieRanks.InsertOnSubmit(movieRank);
                                try
                                {
                                    context.SubmitChanges();
                                }
                                catch (Exception e)
                                {
                                    Debug.WriteLine(e.ToString());
                                }
                            }
                        }
                    }
                }
            } // End foreach statement
        }     // End method initiateDataFromFile()
Example #5
0
 public frmMain()
 {
     InitializeComponent();
     context = new ImdbDataClassDataContext();
 }