Ejemplo n.º 1
0
        public async Task Test_JobSearchQuery_DefaultCriteria_Should_ReturnAll()
        {
            // arrange
            var jobs = new JobFaker().Generate(100);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, jobs);

            var search = new JobSearchCriteria()
            {
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new JobSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(100);
            results.TotalPages.Should().Be(4);
            results.Data.Should().HaveCount(25);
            results.Data.Should().OnlyHaveUniqueItems(x => x.JobId);
        }
Ejemplo n.º 2
0
        public async Task Test_ListJobs_FindAll_Should_ReturnPagedList()
        {
            // arrange
            var jobs = new JobFaker()
                       .Generate(100);

            await using var context = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await context.Setup(x => x.Jobs, jobs);

            var search = new JobSearchCriteria()
            {
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var result = await _service.ListJobs(search, paging);

            // assert
            result.Should().NotBeNull();
            result.IsOk().Should().BeTrue();

            var payload = result.Payload;

            payload.TotalItems.Should().Be(100);
            payload.TotalPages.Should().Be(4);
            payload.Data.Should().HaveCount(25);
        }
Ejemplo n.º 3
0
        public async Task Test_JobSearchQuery_FindByTypeAndNamespace_Should_ReturnMatching()
        {
            // arrange
            var jobs = new JobFaker().Generate(100);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, jobs);

            var expected = jobs[39];
            var search   = new JobSearchCriteria()
            {
                Type = expected.Type, Namespace = expected.Namespace
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new JobSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(1);
            results.TotalPages.Should().Be(1);
            results.Data.Should().HaveCount(1);
            results.Data.Should().OnlyContain(x => x.Type == expected.Type && x.Namespace == expected.Namespace);
        }
Ejemplo n.º 4
0
        public async Task GetJobsAsync_returns_Jobs_by_JobStatus(params JobStatus[] jobStatuses)
        {
            string ownerId = TestMemoryCacheJobRepositoryFactory.OwnerIds[0];

            _testMemoryCacheJobRepositoryFactory.MockJobCache
            .Setup(jobCache => jobCache.Query())
            .Returns(() => TestMemoryCacheJobRepositoryFactory.Jobs.AsQueryable())
            .Verifiable();

            var memoryCacheJobRepository = _testMemoryCacheJobRepositoryFactory.CreateMemoryCacheJobRepository();

            var jobSearchCriteria = new JobSearchCriteria
            {
                JobOwnerId = ownerId
            }
            .WithJobStatuses(jobStatuses);

            IReadOnlyCollection <Job> actualJobs = await memoryCacheJobRepository.GetJobsAsync(jobSearchCriteria);

            IReadOnlyCollection <Job> expectedJobs = TestMemoryCacheJobRepositoryFactory.Jobs
                                                     .Where(job => job.JobOwnerId.Contains(ownerId) && jobStatuses.Contains(job.JobStatus))
                                                     .OrderBy(job => job.ExecuteAfter ?? job.CreatedAt)
                                                     .ToList()
                                                     .AsReadOnly();

            Assert.Equal(expectedJobs, actualJobs);

            _testMemoryCacheJobRepositoryFactory.MockJobCache
            .Verify(
                jobCache => jobCache.Query(),
                Times.Once);
        }
Ejemplo n.º 5
0
        public async Task Test_ListJobs_Find_ByCorrelationId_Should_ReturnPagedList()
        {
            // arrange
            var correlationId = Guid.NewGuid();
            var bulkJobs      = new JobFaker().Generate(100);
            var relatedJobs   = new JobFaker().SetCorrelationId(correlationId).Generate(10);

            await using var context = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await context.Setup(x => x.Jobs, bulkJobs);

            await context.Setup(x => x.Jobs, relatedJobs);

            var search = new JobSearchCriteria()
            {
                CorrelationId = correlationId
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var result = await _service.ListJobs(search, paging);

            // assert
            result.Should().NotBeNull();
            result.IsOk().Should().BeTrue();

            var payload = result.Payload;

            payload.TotalItems.Should().Be(10);
            payload.TotalPages.Should().Be(1);
            payload.Data.Should().HaveCount(10);
            payload.Data.Should().OnlyContain(x => relatedJobs.Select(j => j.JobId).Contains(x.JobId));
        }
Ejemplo n.º 6
0
        public async Task Test_JobSearchQuery_FindByCorrelationId_None_Should_ReturnEmpty()
        {
            // arrange
            var correlationId = Guid.NewGuid();
            var bulkJobs      = new JobFaker().Generate(100);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, bulkJobs);

            var search = new JobSearchCriteria()
            {
                CorrelationId = correlationId
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new JobSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(0);
            results.TotalPages.Should().Be(0);
            results.Data.Should().BeNullOrEmpty();
        }
Ejemplo n.º 7
0
        public async Task Test_JobSearchQuery_FindByCorrelationId_Should_ReturnMatching()
        {
            // arrange
            var correlationId = Guid.NewGuid();
            var bulkJobs      = new JobFaker().Generate(100);
            var relatedJobs   = new JobFaker().SetCorrelationId(correlationId).Generate(13);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, bulkJobs);

            await dbContext.Setup(x => x.Jobs, relatedJobs);

            var search = new JobSearchCriteria()
            {
                CorrelationId = correlationId
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new JobSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(13);
            results.TotalPages.Should().Be(1);
            results.Data.Should().HaveCount(13);
            results.Data.Should().OnlyContain(x => relatedJobs.Select(j => j.JobId).Contains(x.JobId));
        }
Ejemplo n.º 8
0
        public async Task GetJobsAsync_returns_Jobs_on_or_after_ExecuteAfter_marker(int minutesAfterMarker)
        {
            string ownerId = TestMemoryCacheJobRepositoryFactory.OwnerIds[0];

            _testMemoryCacheJobRepositoryFactory.MockJobCache
            .Setup(jobCache => jobCache.Query())
            .Returns(() => TestMemoryCacheJobRepositoryFactory.Jobs.AsQueryable())
            .Verifiable();

            var memoryCacheJobRepository = _testMemoryCacheJobRepositoryFactory.CreateMemoryCacheJobRepository();

            DateTimeOffset executeAfter = TestMemoryCacheJobRepositoryFactory.ExecuteAfterMarker.AddMinutes(minutesAfterMarker);

            var jobSearchCriteria = new JobSearchCriteria
            {
                JobOwnerId   = ownerId,
                ExecuteAfter = executeAfter
            };

            IReadOnlyCollection <Job> actualJobs = await memoryCacheJobRepository.GetJobsAsync(jobSearchCriteria);

            IReadOnlyCollection <Job> expectedJobs = TestMemoryCacheJobRepositoryFactory.Jobs
                                                     .Where(job => job.JobOwnerId.Contains(ownerId) && executeAfter >= job.ExecuteAfter)
                                                     .OrderBy(job => job.ExecuteAfter ?? job.CreatedAt)
                                                     .ToList()
                                                     .AsReadOnly();

            Assert.Equal(expectedJobs, actualJobs);

            _testMemoryCacheJobRepositoryFactory.MockJobCache
            .Verify(
                jobCache => jobCache.Query(),
                Times.Once);
        }
Ejemplo n.º 9
0
        public async Task <IResult <PagedResult <JobSearchResult> > > ListJobs(JobSearchCriteria criteria, PagingCriteria paging)
        {
            var query   = new JobSearchQuery(_dbContext);
            var results = await query.Find(criteria, paging);

            return(Result.Ok(results));
        }
Ejemplo n.º 10
0
        public async Task <IActionResult> ListJobs([FromQuery] JobSearchCriteria search, [FromQuery] PagingCriteria paging)
        {
            _logger.LogInformation("Finding all jobs for criteria = [{Criteria}]", search);
            _logger.LogInformation("Page  = [{Paging}]", paging);

            var result = await _jobService.ListJobs(search, paging);

            return(Ok(result.Payload));
        }
Ejemplo n.º 11
0
        /// Gets the search results and displays on the screen.
        /// </summary>
        /// <param name="criteria">The job search criteria.</param>
        private void PopulateData(JobSearchCriteria criteria)
        {
            // get some results
            // need to impersonate as the service account so we can access the Import Control database.
            string serviceAccount = ConfigurationManager.AppSettings[Constants.ConfigurationKeys.ServiceAccount].ToString();
            string domain         = ConfigurationManager.AppSettings[Constants.ConfigurationKeys.ServiceAccountDomain].ToString();
            string password       = ConfigurationManager.AppSettings[Constants.ConfigurationKeys.ServiceAccountPassword].ToString();

            WindowsImpersonationContext context = null;

            try
            {
                context = IMS.NCS.CourseSearchService.Common.Utilities.impersonateValidUser(serviceAccount, domain, password);
                if (context != null)
                {
                    IDashboardService service      = new DashboardService();
                    DashboardJob      dashboardJob = service.GetJobList(criteria);

                    if (dashboardJob != null && dashboardJob.Jobs.Count() > 0)
                    {
                        divSearchResults.Visible = true;

                        ResultsOverviewLabel.Text = String.Format(Constants.StringFormats.ResultsOverviewStringFormat, dashboardJob.CurrentPageNo, dashboardJob.TotalPages, dashboardJob.TotalRecords);

                        SetupPageNavButtons(dashboardJob.TotalPages, dashboardJob.CurrentPageNo);

                        gridJobs.DataSource = dashboardJob.Jobs;
                        gridJobs.DataBind();
                    }
                    else
                    {
                        DisplayNoResults();
                    }
                }
                else
                {
                    ResultsOverviewLabel.Text = "The service account cannot be impersonated.";
                }
            }
            catch (Exception ex)
            {
                ResultsOverviewLabel.Text = ex.Message + "\n" + ex.StackTrace;
            }
            finally
            {
                if (context != null)
                {
                    IMS.NCS.CourseSearchService.Common.Utilities.UndoImpersonation(context);
                }
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Populates the search controls with the values from the search criteria.
        /// </summary>
        /// <param name="criteria">The populated search criteria.</param>
        public void PopulatePage(JobSearchCriteria criteria)
        {
            string scriptName = "PopulateCriteria";
            Type   thisType   = this.GetType();

            ClientScriptManager mgr = Page.ClientScript;

            if (!mgr.IsStartupScriptRegistered(thisType, scriptName))
            {
                StringBuilder scriptText = new StringBuilder();
                scriptText.Append("<script type=text/javascript>" + Environment.NewLine);

                if (criteria.StartDate != DateTime.MinValue)
                {
                    scriptText.Append(Utilities.GetJavascriptSetValueSnippet("StartDate", criteria.StartDate.ToString("dd/MM/yyyy")));
                }
                if (criteria.EndDate != DateTime.MinValue)
                {
                    scriptText.Append(Utilities.GetJavascriptSetValueSnippet("EndDate", criteria.EndDate.ToString("dd/MM/yyyy")));
                }

                scriptText.Append(Utilities.GetJavascriptSetValueSnippet("RecordsPerPage", criteria.RecordsPerPage.ToString()));
                // only set dropdowns if the user selected a value
                if (!string.IsNullOrEmpty(criteria.SortBy))
                {
                    scriptText.Append(Utilities.GetJavascriptSetValueSnippet("SortBy", criteria.SortBy));
                }

                if (criteria.InProgressJobs)
                {
                    scriptText.Append(Utilities.GetJavascriptSetCheckboxValueSnippet("JobStatus_InProgress", "Y"));
                }

                if (criteria.CompletedJobs)
                {
                    scriptText.Append(Utilities.GetJavascriptSetCheckboxValueSnippet("JobStatus_Complete", "Y"));
                }

                if (criteria.FailedJobs)
                {
                    scriptText.Append(Utilities.GetJavascriptSetCheckboxValueSnippet("JobStatus_Failed", "Y"));
                }

                // end
                scriptText.Append("</script>");

                mgr.RegisterStartupScript(thisType, scriptName, scriptText.ToString());
            }
        }
        public Task <IReadOnlyCollection <Job> > GetJobsAsync(JobSearchCriteria jobSearchCriteria)
        {
            if (jobSearchCriteria == null)
            {
                throw new ArgumentNullException(nameof(jobSearchCriteria));
            }

            IQueryable <Job> jobQuery = _jobCache.Query();

            if (!string.IsNullOrEmpty(jobSearchCriteria.JobOwnerId))
            {
                jobQuery = jobQuery.Where(job => job.JobOwnerId.Contains(jobSearchCriteria.JobOwnerId, StringComparison.OrdinalIgnoreCase));
            }

            if (jobSearchCriteria.JobStatuses.Count > 0)
            {
                jobQuery = jobQuery.Where(job => jobSearchCriteria.JobStatuses.Contains(job.JobStatus));
            }

            if (jobSearchCriteria.ExecuteAfter.HasValue)
            {
                jobQuery = jobQuery.Where(job => jobSearchCriteria.ExecuteAfter >= job.ExecuteAfter);
            }

            jobQuery = jobQuery.OrderBy(job => job.ExecuteAfter ?? job.CreatedAt);

            if (jobSearchCriteria.ItemsToSkip.HasValue)
            {
                jobQuery = jobQuery.Skip(jobSearchCriteria.ItemsToSkip.Value);
            }

            if (jobSearchCriteria.MaximumItems.HasValue)
            {
                jobQuery = jobQuery.Take(jobSearchCriteria.MaximumItems.Value);
            }

            IReadOnlyCollection <Job> jobes = jobQuery
                                              .ToList()
                                              .AsReadOnly();

            return(Task.FromResult(jobes));
        }
Ejemplo n.º 14
0
        public async Task GetJobsAsync_returns_constrained_results(int?skip, int?limit)
        {
            string ownerId = TestMemoryCacheJobRepositoryFactory.OwnerIds[0];

            _testMemoryCacheJobRepositoryFactory.MockJobCache
            .Setup(jobCache => jobCache.Query())
            .Returns(() => TestMemoryCacheJobRepositoryFactory.Jobs.AsQueryable())
            .Verifiable();

            var memoryCacheJobRepository = _testMemoryCacheJobRepositoryFactory.CreateMemoryCacheJobRepository();

            var jobSearchCriteria = new JobSearchCriteria
            {
                JobOwnerId   = ownerId,
                ItemsToSkip  = skip,
                MaximumItems = limit
            };

            IReadOnlyCollection <Job> actualJobs = await memoryCacheJobRepository.GetJobsAsync(jobSearchCriteria);

            IEnumerable <Job> expectedJobs = TestMemoryCacheJobRepositoryFactory.Jobs
                                             .Where(job => job.JobOwnerId.Contains(ownerId))
                                             .OrderBy(job => job.ExecuteAfter ?? job.CreatedAt);

            if (skip != null)
            {
                expectedJobs = expectedJobs.Skip(skip.Value);
            }

            if (limit != null)
            {
                expectedJobs = expectedJobs.Take(limit.Value);
            }

            Assert.Equal(expectedJobs, actualJobs);

            _testMemoryCacheJobRepositoryFactory.MockJobCache
            .Verify(
                jobCache => jobCache.Query(),
                Times.Once);
        }
Ejemplo n.º 15
0
        public async Task Test_JobSearchQuery_NoData_Should_ReturnEmptyResult()
        {
            // arrange
            var search = new JobSearchCriteria()
            {
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var dbContext = GetDbContext();
            var results   = await new JobSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(0);
            results.TotalPages.Should().Be(0);
            results.Data.Should().BeNullOrEmpty();
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Creates the search criteria from the QueryString.
        /// </summary>
        /// <param name="requestData">The query string data.</param>
        /// <returns>A JobSearchCriteria with data.</returns>
        private JobSearchCriteria CreateSearchCriteria(NameValueCollection requestData)
        {
            bool result;
            JobSearchCriteria criteria = new JobSearchCriteria();
            DateTime          tempDateTime;

            result = DateTime.TryParse(Utilities.GetQueryStringValue(requestData, "EndDate"), out tempDateTime);
            if (result)
            {
                criteria.EndDate = tempDateTime.Date;
            }

            result = DateTime.TryParse(Utilities.GetQueryStringValue(requestData, "StartDate"), out tempDateTime);
            if (result)
            {
                criteria.StartDate = tempDateTime.Date;
            }

            string[] jobStatuses = Utilities.GetQueryStringValues(Page.Request.QueryString, "JobStatus");
            criteria.CompletedJobs  = jobStatuses != null && jobStatuses.Contains("Completed");
            criteria.InProgressJobs = jobStatuses != null && jobStatuses.Contains("InProgress");
            criteria.FailedJobs     = jobStatuses != null && jobStatuses.Contains("Failed");

            // default SortBy if the user hasn't entered one
            criteria.SortBy = Utilities.GetQueryStringValue(Page.Request.QueryString, Constants.QueryStrings.SortBy);
            criteria.SortBy = criteria.SortBy == string.Empty ? "StartDate" : criteria.SortBy;

            criteria.RecordsPerPage = Int32.Parse(Utilities.GetQueryStringValue(Page.Request.QueryString, Constants.QueryStrings.RecordsPerPage));
            criteria.RecordsPerPage = criteria.RecordsPerPage == 0 ? 10 : criteria.RecordsPerPage;

            // default to first page if next page not set
            string nextPage = Utilities.GetQueryStringValue(Page.Request.QueryString, Constants.QueryStrings.GetPage);

            criteria.NextPage = string.IsNullOrEmpty(nextPage) ? 1 : Int32.Parse(nextPage);

            return(criteria);
        }
        /// <summary>
        /// Gets a list of Jobs for the search criteria.
        /// </summary>
        /// <param name="searchCriteria">The search criteria.</param>
        /// <returns>A DashboardJob of data.</returns>
        DashboardJob IDashboardService.GetJobList(JobSearchCriteria searchCriteria)
        {
            IDashboardQuery query = new DashboardQuery();

            return(query.GetJobList(searchCriteria));
        }
Ejemplo n.º 18
0
        public async Task Test_JobSearchQuery_PageForward_Should_ReturnNewPage()
        {
            // arrange
            var jobs = new JobFaker().Generate(100);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, jobs);

            var search = new JobSearchCriteria();

            // act
            var query = new JobSearchQuery(dbContext);
            var page1 = await query.Find(search, new PagingCriteria()
            {
                Page = 1, Size = 5
            });

            var page2 = await query.Find(search, new PagingCriteria()
            {
                Page = 2, Size = 5
            });

            var page3 = await query.Find(search, new PagingCriteria()
            {
                Page = 3, Size = 5
            });

            var page10 = await query.Find(search, new PagingCriteria()
            {
                Page = 10, Size = 5
            });

            // assert
            page1.Should().NotBeNull();
            page1.Page.Should().Be(1);
            page1.TotalItems.Should().Be(100);
            page1.TotalPages.Should().Be(20);
            page1.Data.Should()
            .NotContain(page2.Data)
            .And.NotContain(page3.Data)
            .And.NotContain(page10.Data);

            page2.Should().NotBeNull();
            page2.Page.Should().Be(2);
            page2.TotalItems.Should().Be(100);
            page2.TotalPages.Should().Be(20);
            page2.Data.Should()
            .NotContain(page1.Data)
            .And.NotContain(page3.Data)
            .And.NotContain(page10.Data);

            page3.Should().NotBeNull();
            page3.Page.Should().Be(3);
            page3.TotalItems.Should().Be(100);
            page3.TotalPages.Should().Be(20);
            page3.Data.Should()
            .NotContain(page1.Data)
            .And.NotContain(page2.Data)
            .And.NotContain(page10.Data);

            page10.Should().NotBeNull();
            page10.Page.Should().Be(10);
            page10.TotalItems.Should().Be(100);
            page10.TotalPages.Should().Be(20);
            page10.Data.Should()
            .NotContain(page1.Data)
            .And.NotContain(page2.Data)
            .And.NotContain(page3.Data);
        }
        /// <summary>
        /// Gets a list of Jobs for the search criteria.
        /// </summary>
        /// <param name="searchCriteria">The search criteria.</param>
        /// <returns>A DashboardJob of data.</returns>
        DashboardJob IDashboardQuery.GetJobList(JobSearchCriteria searchCriteria)
        {
            IDashboardGateway gateway = new DashboardGateway();

            return(gateway.GetJobList(searchCriteria));
        }
        /// <summary>
        /// Gets a list of Jobs for the search criteria.
        /// </summary>
        /// <param name="searchCriteria">The search criteria.</param>
        /// <returns>A DashboardJob of data.</returns>
        DashboardJob IDashboardGateway.GetJobList(JobSearchCriteria searchCriteria)
        {
            DashboardJob dashboardJob = new DashboardJob();

            using (SqlConnection sqlConnection = new SqlConnection(Utilities.GetDatabaseConnection()))
            {
                using (SqlCommand command = new SqlCommand())
                {
                    command.Connection  = sqlConnection;
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandText = Constants.Database.UspGetJobsByCriteria;

                    if (searchCriteria.StartDate != DateTime.MinValue)
                    {
                        AddParameter(command, SqlDbType.DateTime, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.StartDate, searchCriteria.StartDate);
                    }
                    else
                    {
                        AddParameter(command, SqlDbType.DateTime, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.StartDate, DBNull.Value);
                    }
                    if (searchCriteria.EndDate != DateTime.MinValue)
                    {
                        AddParameter(command, SqlDbType.DateTime, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.EndDate, searchCriteria.EndDate);
                    }
                    else
                    {
                        AddParameter(command, SqlDbType.DateTime, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.EndDate, DBNull.Value);
                    }


                    AddBoolParameter(command, SqlDbType.Bit, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.InProgressJobs, searchCriteria.InProgressJobs);
                    AddBoolParameter(command, SqlDbType.Bit, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.CompletedJobs, searchCriteria.CompletedJobs);
                    AddBoolParameter(command, SqlDbType.Bit, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.FailedJobs, searchCriteria.FailedJobs);
                    AddParameter(command, SqlDbType.VarChar, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.SortBy, searchCriteria.SortBy);
                    AddParameter(command, SqlDbType.Int, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.NoOfRecords, searchCriteria.RecordsPerPage);
                    AddParameter(command, SqlDbType.Int, ParameterDirection.Input, Constants.UspGetJobsByCriteriaParameters.PageNo, searchCriteria.NextPage);
                    AddParameter(command, SqlDbType.Int, ParameterDirection.Output, Constants.UspGetJobsByCriteriaParameters.TotalRows);

                    command.Connection.Open();
                    SqlDataReader reader = command.ExecuteReader();

                    List <Job> jobsList = new List <Job>();
                    while (reader.Read())
                    {
                        Job job = new Job();
                        job.CurrentStep = (string)reader[Constants.UspGetJobsByCriteriaColumns.CurrentStep];
                        object tempObj = reader[Constants.UspGetJobsByCriteriaColumns.ElapsedTime];
                        if (tempObj != DBNull.Value)
                        {
                            job.ElapsedTime = (long)tempObj;
                        }

                        tempObj = reader[Constants.UspGetJobsByCriteriaColumns.JobId];
                        if (tempObj != DBNull.Value)
                        {
                            job.JobId = (int)reader[Constants.UspGetJobsByCriteriaColumns.JobId];
                        }

                        tempObj = reader[Constants.UspGetJobsByCriteriaColumns.JobName];
                        if (tempObj != DBNull.Value)
                        {
                            job.JobName = (string)reader[Constants.UspGetJobsByCriteriaColumns.JobName];
                        }

                        tempObj = reader[Constants.UspGetJobsByCriteriaColumns.ProcessEnd];
                        if (tempObj != DBNull.Value)
                        {
                            job.ProcessEnd = (DateTime)reader[Constants.UspGetJobsByCriteriaColumns.ProcessEnd];
                        }

                        tempObj = reader[Constants.UspGetJobsByCriteriaColumns.ProcessStart];
                        if (tempObj != DBNull.Value)
                        {
                            job.ProcessStart = (DateTime)reader[Constants.UspGetJobsByCriteriaColumns.ProcessStart];
                        }
                        job.Status = (string)reader[Constants.UspGetJobsByCriteriaColumns.Status];

                        jobsList.Add(job);
                    }

                    // need to close the reader to get hold of the output params
                    // and create our paging values
                    reader.Close();
                    dashboardJob.CurrentPageNo = searchCriteria.NextPage;
                    dashboardJob.TotalRecords  = Int32.Parse(GetOutputParameter(command, Constants.UspGetJobsByCriteriaParameters.TotalRows));
                    var result     = Decimal.Divide((decimal)dashboardJob.TotalRecords, (decimal)searchCriteria.RecordsPerPage);
                    var totalPages = Math.Ceiling((decimal)result);
                    dashboardJob.TotalPages = (int)totalPages;

                    command.Connection.Close();

                    dashboardJob.Jobs = jobsList;
                }
            }

            return(dashboardJob);
        }