Skip to content

Commit

Permalink
Added index timestamp
Browse files Browse the repository at this point in the history
  • Loading branch information
analogrelay committed Apr 18, 2014
1 parent 9fd3477 commit 2461a62
Show file tree
Hide file tree
Showing 14 changed files with 49 additions and 19 deletions.
4 changes: 4 additions & 0 deletions src/NuGetGallery/Content/Site.css
Expand Up @@ -476,6 +476,10 @@ fieldset.search {

/* List Package */

.package-list-lastupdated {
font-size: 14pt;
}

section.package {
border-top: 1px solid #ccc;
padding-top: 10px;
Expand Down
1 change: 1 addition & 0 deletions src/NuGetGallery/Controllers/CuratedFeedsController.cs
Expand Up @@ -81,6 +81,7 @@ public virtual async Task<ActionResult> ListPackages(string curatedFeedName, str

var viewModel = new PackageListViewModel(
results.Data,
results.IndexTimestampUtc,
q,
totalHits,
page - 1,
Expand Down
1 change: 1 addition & 0 deletions src/NuGetGallery/Controllers/PackagesController.cs
Expand Up @@ -303,6 +303,7 @@ public virtual async Task<ActionResult> ListPackages(string q, int page = 1)

var viewModel = new PackageListViewModel(
results.Data,
results.IndexTimestampUtc,
q,
totalHits,
page - 1,
Expand Down
5 changes: 5 additions & 0 deletions src/NuGetGallery/ExtensionMethods.cs
Expand Up @@ -23,6 +23,11 @@ namespace NuGetGallery
{
public static class ExtensionMethods
{
public static string ToJavaScriptUTC(this DateTime self)
{
return self.ToString("yyyy-MM-dd HH:mm:ss UTC", CultureInfo.CurrentCulture);
}

public static string ToNuGetShortDateTimeString(this DateTime self)
{
return self.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture);
Expand Down
Expand Up @@ -111,12 +111,13 @@ private async Task<SearchResults> SearchCore(SearchFilter filter, bool raw)
var content = await result.ReadContent();
if (filter.CountOnly || content.TotalHits == 0)
{
results = new SearchResults(content.TotalHits);
results = new SearchResults(content.TotalHits, content.IndexTimestamp);
}
else
{
results = new SearchResults(
content.TotalHits,
content.IndexTimestamp,
content.Data.Select(ReadPackage).AsQueryable());
}
}
Expand Down
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Lucene.Net.Analysis;
Expand Down Expand Up @@ -49,6 +50,9 @@ public Task<SearchResults> Search(SearchFilter searchFilter)

private SearchResults SearchCore(SearchFilter searchFilter)
{
// Get index timestamp
DateTime timestamp = File.GetLastWriteTimeUtc(LuceneCommon.GetIndexMetadataPath());

int numRecords = searchFilter.Skip + searchFilter.Take;

var searcher = new IndexSearcher(_directory, readOnly: true);
Expand Down Expand Up @@ -77,7 +81,7 @@ private SearchResults SearchCore(SearchFilter searchFilter)

if (results.TotalHits == 0 || searchFilter.CountOnly)
{
return new SearchResults(results.TotalHits);
return new SearchResults(results.TotalHits, timestamp);
}

var packages = results.ScoreDocs
Expand All @@ -86,6 +90,7 @@ private SearchResults SearchCore(SearchFilter searchFilter)
.ToList();
return new SearchResults(
results.TotalHits,
timestamp,
packages.AsQueryable());
}

Expand Down
8 changes: 4 additions & 4 deletions src/NuGetGallery/NuGetGallery.csproj
Expand Up @@ -271,13 +271,13 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\NuGet.Core.2.8.1\lib\net40-Client\NuGet.Core.dll</HintPath>
</Reference>
<Reference Include="NuGet.Services.Platform.Client, Version=3.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="NuGet.Services.Platform.Client, Version=3.0.11.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\NuGet.Services.Platform.Client.3.0.3-rel-0008\lib\portable-net45+wp80+win\NuGet.Services.Platform.Client.dll</HintPath>
<HintPath>..\..\packages\NuGet.Services.Platform.Client.3.0.11-r-master\lib\portable-net45+wp80+win\NuGet.Services.Platform.Client.dll</HintPath>
</Reference>
<Reference Include="NuGet.Services.Search.Client, Version=3.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="NuGet.Services.Search.Client, Version=3.0.16.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\NuGet.Services.Search.Client.3.0.3-rel-0015\lib\portable-net45+wp80+win\NuGet.Services.Search.Client.dll</HintPath>
<HintPath>..\..\packages\NuGet.Services.Search.Client.3.0.16-r-master\lib\portable-net45+wp80+win\NuGet.Services.Search.Client.dll</HintPath>
</Reference>
<Reference Include="ODataNullPropagationVisitor">
<HintPath>..\..\packages\ODataNullPropagationVisitor.0.5.4237.2641\lib\net40\ODataNullPropagationVisitor.dll</HintPath>
Expand Down
11 changes: 7 additions & 4 deletions src/NuGetGallery/Services/ISearchService.cs
@@ -1,4 +1,5 @@
using System.Linq;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace NuGetGallery
Expand Down Expand Up @@ -31,17 +32,19 @@ public interface IRawSearchService
public class SearchResults
{
public int Hits { get; private set; }
public DateTime? IndexTimestampUtc { get; private set; }
public IQueryable<Package> Data { get; private set; }

public SearchResults(int hits)
: this(hits, Enumerable.Empty<Package>().AsQueryable())
public SearchResults(int hits, DateTime? indexTimestampUtc)
: this(hits, indexTimestampUtc, Enumerable.Empty<Package>().AsQueryable())
{
}

public SearchResults(int hits, IQueryable<Package> data)
public SearchResults(int hits, DateTime? indexTimestampUtc, IQueryable<Package> data)
{
Hits = hits;
Data = data;
IndexTimestampUtc = indexTimestampUtc;
}
}
}
7 changes: 6 additions & 1 deletion src/NuGetGallery/ViewModels/PackageListViewModel.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

Expand All @@ -8,6 +9,7 @@ public class PackageListViewModel
{
public PackageListViewModel(
IQueryable<Package> packages,
DateTime? indexTimestampUtc,
string searchTerm,
int totalCount,
int pageIndex,
Expand All @@ -17,6 +19,7 @@ public class PackageListViewModel
// TODO: Implement actual sorting
IEnumerable<ListPackageItemViewModel> items = packages.ToList().Select(pv => new ListPackageItemViewModel(pv));
PageIndex = pageIndex;
IndexTimestampUtc = indexTimestampUtc;
PageSize = pageSize;
TotalCount = totalCount;
SearchTerm = searchTerm;
Expand Down Expand Up @@ -49,5 +52,7 @@ public class PackageListViewModel
public int PageIndex { get; private set; }

public int PageSize { get; private set; }

public DateTime? IndexTimestampUtc { get; private set; }
}
}
6 changes: 5 additions & 1 deletion src/NuGetGallery/Views/Shared/ListPackages.cshtml
Expand Up @@ -27,10 +27,14 @@
<text>There are @Model.TotalCount packages</text>
}</h1>
}
@if (@Model.LastResultIndex > 0)
@if (Model.LastResultIndex > 0)
{
<h2>Displaying results @Model.FirstResultIndex - @Model.LastResultIndex.</h2>
}
@if(Model.IndexTimestampUtc.HasValue)
{
<h3 class="package-list-lastupdated">Search Index last updated <span class="s-localtime" data-utc="@Model.IndexTimestampUtc.Value.ToJavaScriptUTC()">@Model.IndexTimestampUtc.Value.ToJavaScriptUTC()</span></h3>
}
</div>

<span class="sorted-by">Sorted by Recent Installs</span>
Expand Down
4 changes: 2 additions & 2 deletions src/NuGetGallery/packages.config
Expand Up @@ -51,8 +51,8 @@
<package id="Ninject.Web.Common" version="3.0.0.7" targetFramework="net45" />
<package id="NuGet.Core" version="2.8.1" targetFramework="net45" />
<package id="NuGet.Services.Build" version="3.0.4-rel-4" targetFramework="net45" developmentDependency="true" />
<package id="NuGet.Services.Platform.Client" version="3.0.3-rel-0008" targetFramework="net45" />
<package id="NuGet.Services.Search.Client" version="3.0.3-rel-0015" targetFramework="net45" />
<package id="NuGet.Services.Platform.Client" version="3.0.11-r-master" targetFramework="net45" />
<package id="NuGet.Services.Search.Client" version="3.0.16-r-master" targetFramework="net45" />
<package id="ODataNullPropagationVisitor" version="0.5.4237.2641" />
<package id="Owin" version="1.0" targetFramework="net45" />
<package id="PoliteCaptcha" version="0.4.0.0" targetFramework="net45" />
Expand Down
Expand Up @@ -213,7 +213,7 @@ public async Task WillSearchForAPackage()

controller.StubSearchService
.Setup(stub => stub.Search(It.IsAny<SearchFilter>()))
.Returns(Task.FromResult(new SearchResults(mockPackages.Count(), mockPackages)));
.Returns(Task.FromResult(new SearchResults(mockPackages.Count(), DateTime.UtcNow, mockPackages)));

var mockHttpContext = new Mock<HttpContextBase>();
TestUtility.SetupHttpContextMockForUrlGeneration(mockHttpContext, controller);
Expand Down
Expand Up @@ -108,7 +108,7 @@ private static Mock<ISearchService> CreateSearchService()
{
var searchService = new Mock<ISearchService>();
searchService.Setup(s => s.Search(It.IsAny<SearchFilter>())).Returns(
(IQueryable<Package> p, string searchTerm) => Task.FromResult(new SearchResults(p.Count(), p)));
(IQueryable<Package> p, string searchTerm) => Task.FromResult(new SearchResults(p.Count(), DateTime.UtcNow, p)));

return searchService;
}
Expand Down Expand Up @@ -574,7 +574,7 @@ public async Task TrimsSearchTerm()
{
var searchService = new Mock<ISearchService>();
searchService.Setup(s => s.Search(It.IsAny<SearchFilter>())).Returns(
Task.FromResult(new SearchResults(0)));
Task.FromResult(new SearchResults(0, DateTime.UtcNow)));
var controller = CreateController(searchService: searchService);
controller.SetCurrentUser(TestUtility.FakeUser);

Expand Down
5 changes: 3 additions & 2 deletions tests/NuGetGallery.Facts/Services/FeedServiceFacts.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
Expand Down Expand Up @@ -83,7 +84,7 @@ public void V1FeedSearchDoesNotReturnPrereleasePackages()
configuration.Setup(c => c.GetSiteRoot(It.IsAny<bool>())).Returns("https://localhost:8081/");
var searchService = new Mock<ISearchService>(MockBehavior.Strict);
searchService.Setup(s => s.Search(It.IsAny<SearchFilter>())).Returns
<IQueryable<Package>, string>((_, __) => Task.FromResult(new SearchResults(_.Count(), _)));
<IQueryable<Package>, string>((_, __) => Task.FromResult(new SearchResults(_.Count(), DateTime.UtcNow, _)));
searchService.Setup(s => s.ContainsAllVersions).Returns(false);
var v1Service = new TestableV1Feed(repo.Object, configuration.Object, searchService.Object);

Expand Down

0 comments on commit 2461a62

Please sign in to comment.