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); }
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); } }