Пример #1
0
        public List <Tuple <string, int, double> > GetSoleExpertArtifactsForDeveloper(int developerId)
        {
            var developerExpertises = DeveloperExpertises.Include(de => de.Artifact).Include(de => de.DeveloperExpertiseValues).Where(de => de.DeveloperId == developerId && de.Artifact.DeveloperExpertises.Count < 2).AsNoTracking();
            var result = new List <Tuple <string, int, double> >();

            foreach (var developerExpertise in developerExpertises)
            {
                result.AddRange(developerExpertise.DeveloperExpertiseValues.Select(expertise => new Tuple <string, int, double>(developerExpertise.Artifact.Name, developerExpertise.ArtifactId, expertise.Value)));
            }

            return(result);
        }
Пример #2
0
        public List <SimplifiedDeveloperExpertise> GetDevelopersForArtifactAndAlgorithm(int artifactId, int algorithmId)
        {
            var developerExpertises = DeveloperExpertises.Include(de => de.Developer).Include(de => de.DeveloperExpertiseValues).Where(de => de.ArtifactId == artifactId).AsNoTracking();
            var result = new List <SimplifiedDeveloperExpertise>();

            foreach (var developerExpertise in developerExpertises)
            {
                result.AddRange(from expertise in developerExpertise.DeveloperExpertiseValues where expertise.AlgorithmId == algorithmId select new SimplifiedDeveloperExpertise {
                    DeveloperName = developerExpertise.Developer.Name, DeveloperId = developerExpertise.DeveloperId, Expertise = expertise.Value
                });
            }

            return(result);
        }
        public IEnumerable <DeveloperForPath> GetDevelopersForPath(int repositoryId, string path)
        {
            try
            {
                string sql = string.Format(CultureInfo.InvariantCulture, "CALL GetDevelopersForPath({0},'{1}')", repositoryId, path.Replace("'", "''") + "%");
                return(Database.SqlQuery <DeveloperForPath>(sql).ToList());
            }
            catch (MySql.Data.MySqlClient.MySqlException mse) when(mse.InnerException is TimeoutException)
            {
                // this query can take quite a while. In this handler, we compute the result in single steps. This is slower, but
                // each partial query is less likely to produce a timeout

                List <int> similarArtifactIds = Artifacts
                                                .Where(artifact => artifact.RepositoryId == repositoryId && artifact.Name.StartsWith(path))
                                                .Select(artifact => artifact.ArtifactId)
                                                .ToList();

                IDictionary <int, DeveloperForPath> allDevelopersByDeveloperId = new Dictionary <int, DeveloperForPath>();

                foreach (int artifactId in similarArtifactIds)
                {
                    IEnumerable <DeveloperForPath> relevantDeveloperExpertises = DeveloperExpertises
                                                                                 .Where(de => de.ArtifactId == artifactId)
                                                                                 .Select(de => new DeveloperForPath()
                    {
                        DeveloperId        = de.DeveloperId,
                        IsFirstAuthorCount = de.IsFirstAuthor ? 1 : 0,
                        DeliveriesCount    = de.DeliveriesCount
                    })
                                                                                 .ToList(); // these are only partial results that have to be aggregated

                    foreach (DeveloperForPath dfp in relevantDeveloperExpertises)
                    {
                        if (allDevelopersByDeveloperId.ContainsKey(dfp.DeveloperId))
                        {
                            DeveloperForPath existingEntry = allDevelopersByDeveloperId[dfp.DeveloperId];
                            existingEntry.DeliveriesCount    += dfp.DeliveriesCount;
                            existingEntry.IsFirstAuthorCount += dfp.IsFirstAuthorCount;
                        }
                        else
                        {
                            allDevelopersByDeveloperId[dfp.DeveloperId] = dfp;
                        }
                    }
                }

                return(allDevelopersByDeveloperId.Values);
            }
        }