using System; using System.Collections.Generic; using System.Data.Linq; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HeuristicLab.Services.Hive.DataAccess.Daos { public class AssignedJobResourceDao : GenericDao { public AssignedJobResourceDao(DataContext dataContext) : base(dataContext) { } public override AssignedJobResource GetById(Guid id) { throw new NotImplementedException(); } public IQueryable GetByJobId(Guid jobId) { return Table.Where(x => x.JobId == jobId); } public bool CheckJobGrantedForResource(Guid jobId, Guid resourceId) { return DataContext.ExecuteQuery(CheckJobGrantedForResourceQueryString, jobId, resourceId).First() > 0; } public bool CheckJobGrantedForResources(Guid jobId, Guid[] resourceIds) { return DataContext.ExecuteQuery(CheckJobGrantedForResourcesQueryString).Count() > 0; } public bool CheckTaskGrantedForResource(Guid taskId, Guid resourceId) { return DataContext.ExecuteQuery(CheckTaskGrantedForResourceQueryString, taskId, resourceId).First() > 0; } public IEnumerable GetAllGrantedResourcesByJobId(Guid jobId) { return DataContext.ExecuteQuery(GetAllGrantedResourcesByJobIdQueryString, jobId); } public IEnumerable GetAllGrantedResourceIdsByJobId(Guid jobId) { return DataContext.ExecuteQuery(GetAllGrantedResourceIdsByJobIdQueryString, jobId); } #region String queries private const string CheckJobGrantedForResourceQueryString = @" WITH rbranch AS ( SELECT ResourceId, ParentResourceId FROM [Resource] WHERE ResourceId = {0} UNION ALL SELECT r.ResourceId, r.ParentResourceId FROM [Resource] r JOIN rbranch rb ON rb.ParentResourceId = r.ResourceId ) SELECT COUNT(ajr.JobId) FROM rbranch, AssignedJobResource ajr WHERE rbranch.ResourceId = ajr.ResourceId AND ajr.JobId = {1} "; private const string CheckTaskGrantedForResourceQueryString = @" WITH rbranch AS ( SELECT ResourceId, ParentResourceId FROM [Resource] WHERE ResourceId = {0} UNION ALL SELECT r.ResourceId, r.ParentResourceId FROM [Resource] r JOIN rbranch rb ON rb.ParentResourceId = r.ResourceId ) SELECT COUNT(ajr.JobId) FROM rbranch, AssignedJobResource ajr, Task t WHERE rbranch.ResourceId = ajr.ResourceId AND ajr.JobId = t.JobId AND t.JobId = {1} "; private const string CheckJobGrantedForResourcesQueryString = @" WITH rtree AS ( SELECT ResourceId, ParentResourceId FROM [Resource] UNION ALL SELECT rt.ResourceId, r.ParentResourceId FROM [Resource] r JOIN rtree rt ON rt.ParentResourceId = r.ResourceId ) SELECT r.ResourceId FROM [Resource] r WHERE r.ResourceId IN ({1}) EXCEPT ( SELECT rtree.ResourceId FROM rtree, [AssignedJobResource] ajr WHERE rtree.ParentResourceId = ajr.ResourceId AND ajr.JobId = {0} UNION SELECT ajr.ResourceId FROM [AssignedJobResource] ajr WHERE ajr.JobId = {0} ) "; private const string GetAllGrantedResourcesByJobIdQueryString = @" WITH rtree AS ( SELECT ResourceId, ParentResourceId FROM [Resource] UNION ALL SELECT rt.ResourceId, r.ParentResourceId FROM [Resource] r JOIN rtree rt ON rt.ParentResourceId = r.ResourceId ) SELECT res.* FROM rtree, [AssignedJobResource] ajr, [Resource] res WHERE rtree.ParentResourceId = ajr.ResourceId AND rtree.ResourceId = res.ResourceId AND ajr.JobId = {0} UNION SELECT res.* FROM [AssignedJobResource] ajr, [Resource] res WHERE ajr.ResourceId = res.ResourceId AND ajr.JobId = {0} "; private const string GetAllGrantedResourceIdsByJobIdQueryString = @" WITH rtree AS ( SELECT ResourceId, ParentResourceId FROM [Resource] UNION ALL SELECT rt.ResourceId, r.ParentResourceId FROM [Resource] r JOIN rtree rt ON rt.ParentResourceId = r.ResourceId ) SELECT rtree.ResourceId FROM rtree, [AssignedJobResource] ajr WHERE rtree.ParentResourceId = ajr.ResourceId AND ajr.JobId = {0} UNION SELECT ajr.ResourceId FROM [AssignedJobResource] ajr WHERE ajr.JobId = {0} "; #endregion } }