Skip to content
This repository has been archived by the owner on Mar 16, 2021. It is now read-only.

Commit

Permalink
Filter semver2 results from Version list (#156)
Browse files Browse the repository at this point in the history
* Filter versions results on SemVer2ness. Fix existing tests.
* Adding tests for VersionResult.
  • Loading branch information
ryuyu committed Apr 7, 2017
1 parent a2f3a3f commit d7c8be1
Show file tree
Hide file tree
Showing 10 changed files with 328 additions and 31 deletions.
5 changes: 3 additions & 2 deletions src/NuGet.Indexing/Handlers/VersionsHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,13 @@ private VersionResult CreateVersionResult(string id, List<RegistrationEntry> reg
downloads = downloadsByVersion[versionStr];
}

result.VersionDetails.Add(new VersionDetail
result.AllVersionDetails.Add(new VersionDetail
{
Version = versionStr,
Downloads = downloads,
IsStable = !registrationEntry.Version.IsPrerelease,
IsListed = registrationEntry.IsListed
IsListed = registrationEntry.IsListed,
IsSemVer2 = registrationEntry.Version.IsSemVer2
});
}

Expand Down
4 changes: 2 additions & 2 deletions src/NuGet.Indexing/NuGetIndexSearcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public bool TryGetFilter(bool includeUnlisted, bool includePrerelease, NuGetVers

public static int TotalDownloadCounts(VersionResult versions)
{
int allVersions = versions.VersionDetails.Select(v => v.Downloads).Sum();
int allVersions = versions.AllVersionDetails.Select(v => v.Downloads).Sum();

return allVersions;
}
Expand All @@ -104,7 +104,7 @@ public static Tuple<int, int> DownloadCounts(VersionResult versions, string vers
{
int allVersions = TotalDownloadCounts(versions);

int thisVersion = versions.VersionDetails
int thisVersion = versions.AllVersionDetails
.Where(v => v.Version.Equals(version, StringComparison.OrdinalIgnoreCase))
.Select(v => v.Downloads)
.FirstOrDefault();
Expand Down
8 changes: 4 additions & 4 deletions src/NuGet.Indexing/NuGetSearcherManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -365,16 +365,16 @@ protected override void Warm(NuGetIndexSearcher searcher)
using (var writer = new JsonTextWriter(new StreamWriter(new MemoryStream())))
{
ResponseFormatter.WriteV2Result(writer, searcher, topDocs1, 0, 250, SemVerHelpers.SemVer2Level);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs1, 0, 250, false, false, boostedQuery);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs1, 0, 250, false, false, SemVerHelpers.SemVer2Level, boostedQuery);

ResponseFormatter.WriteV2Result(writer, searcher, topDocs2, 0, 250, SemVerHelpers.SemVer2Level);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs2, 0, 250, false, false, boostedQuery);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs2, 0, 250, false, false, SemVerHelpers.SemVer2Level, boostedQuery);

ResponseFormatter.WriteV2Result(writer, searcher, topDocs3, 0, 250, SemVerHelpers.SemVer2Level);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs3, 0, 250, false, false, boostedQuery);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs3, 0, 250, false, false, SemVerHelpers.SemVer2Level, boostedQuery);

ResponseFormatter.WriteV2Result(writer, searcher, topDocs4, 0, 250, SemVerHelpers.SemVer2Level);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs4, 0, 250, false, false, boostedQuery);
ResponseFormatter.WriteSearchResult(writer, searcher, "http", topDocs4, 0, 250, false, false, SemVerHelpers.SemVer2Level, boostedQuery);
}

// Done, we're warm.
Expand Down
49 changes: 37 additions & 12 deletions src/NuGet.Indexing/ResponseFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,23 @@ namespace NuGet.Indexing
public static class ResponseFormatter
{
// V3 implementation - called directly from the integrated Visual Studio client
public static void WriteSearchResult(JsonWriter jsonWriter, NuGetIndexSearcher searcher, string scheme, TopDocs topDocs, int skip, int take, bool includePrerelease, bool includeExplanation, Query query)
public static void WriteSearchResult(
JsonWriter jsonWriter,
NuGetIndexSearcher searcher,
string scheme,
TopDocs topDocs,
int skip,
int take,
bool includePrerelease,
bool includeExplanation,
NuGetVersion semVerLevel,
Query query)
{
Uri baseAddress = searcher.Manager.RegistrationBaseAddress[scheme];

jsonWriter.WriteStartObject();
WriteInfo(jsonWriter, baseAddress, searcher, topDocs);
WriteData(jsonWriter, searcher, topDocs, skip, take, baseAddress, includePrerelease, includeExplanation, query);
WriteData(jsonWriter, searcher, topDocs, skip, take, baseAddress, includePrerelease, includeExplanation, semVerLevel, query);
jsonWriter.WriteEndObject();
}

Expand All @@ -47,7 +57,17 @@ private static void WriteContext(JsonWriter jsonWriter, Uri baseAddress)
jsonWriter.WriteEndObject();
}

private static void WriteData(JsonWriter jsonWriter, NuGetIndexSearcher searcher, TopDocs topDocs, int skip, int take, Uri baseAddress, bool includePrerelease, bool includeExplanation, Query query)
private static void WriteData(
JsonWriter jsonWriter,
NuGetIndexSearcher searcher,
TopDocs topDocs,
int skip,
int take,
Uri baseAddress,
bool includePrerelease,
bool includeExplanation,
NuGetVersion semVerLevel,
Query query)
{
jsonWriter.WritePropertyName("data");

Expand Down Expand Up @@ -81,8 +101,8 @@ private static void WriteData(JsonWriter jsonWriter, NuGetIndexSearcher searcher
WriteDocumentValue(jsonWriter, "projectUrl", document, "ProjectUrl");
WriteDocumentValueAsArray(jsonWriter, "tags", document, "Tags");
WriteDocumentValueAsArray(jsonWriter, "authors", document, "Authors", true);
WriteProperty(jsonWriter, "totalDownloads", searcher.Versions[scoreDoc.Doc].VersionDetails.Select(item => item.Downloads).Sum());
WriteVersions(jsonWriter, baseAddress, id, includePrerelease, searcher.Versions[scoreDoc.Doc]);
WriteProperty(jsonWriter, "totalDownloads", searcher.Versions[scoreDoc.Doc].AllVersionDetails.Select(item => item.Downloads).Sum());
WriteVersions(jsonWriter, baseAddress, id, includePrerelease, semVerLevel, searcher.Versions[scoreDoc.Doc]);

if (includeExplanation)
{
Expand All @@ -101,15 +121,18 @@ private static void WriteVersions(JsonWriter jsonWriter,
Uri baseAddress,
string id,
bool includePrerelease,
NuGetVersion semVerLevel,
VersionResult versionResult)
{
var includeSemVer2 = SemVerHelpers.ShouldIncludeSemVer2Results(semVerLevel);

jsonWriter.WritePropertyName("versions");

jsonWriter.WriteStartArray();

var results = includePrerelease
? versionResult.VersionDetails
: versionResult.StableVersionDetails;
? (includeSemVer2 ? versionResult.SemVer2VersionDetails : versionResult.LegacyVersionDetails)
: (includeSemVer2 ? versionResult.StableSemVer2VersionDetails : versionResult.StableLegacyVersionDetails);

foreach (var item in results.Where(r => r.IsListed))
{
Expand Down Expand Up @@ -142,11 +165,11 @@ public static void WriteAutoCompleteResult(JsonWriter jsonWriter, NuGetIndexSear
jsonWriter.WriteEndObject();
}

public static void WriteAutoCompleteVersionResult(JsonWriter jsonWriter, NuGetIndexSearcher searcher, bool includePrerelease, TopDocs topDocs)
public static void WriteAutoCompleteVersionResult(JsonWriter jsonWriter, NuGetIndexSearcher searcher, bool includePrerelease, NuGetVersion semVerLevel, TopDocs topDocs)
{
jsonWriter.WriteStartObject();
WriteInfo(jsonWriter, null, searcher, topDocs);
WriteVersions(jsonWriter, searcher, includePrerelease, topDocs);
WriteVersions(jsonWriter, searcher, includePrerelease, semVerLevel, topDocs);
jsonWriter.WriteEndObject();
}

Expand Down Expand Up @@ -177,8 +200,10 @@ private static void WriteExplanations(JsonWriter jsonWriter, NuGetIndexSearcher
jsonWriter.WriteEndArray();
}

private static void WriteVersions(JsonWriter jsonWriter, NuGetIndexSearcher searcher, bool includePrerelease, TopDocs topDocs)
private static void WriteVersions(JsonWriter jsonWriter, NuGetIndexSearcher searcher, bool includePrerelease, NuGetVersion semVerLevel, TopDocs topDocs)
{
var includeSemVer2 = SemVerHelpers.ShouldIncludeSemVer2Results(semVerLevel);

jsonWriter.WritePropertyName("data");
jsonWriter.WriteStartArray();

Expand All @@ -187,8 +212,8 @@ private static void WriteVersions(JsonWriter jsonWriter, NuGetIndexSearcher sear
ScoreDoc scoreDoc = topDocs.ScoreDocs[0];

var versions = includePrerelease
? searcher.Versions[scoreDoc.Doc].GetVersions(onlyListed: true)
: searcher.Versions[scoreDoc.Doc].GetStableVersions(onlyListed: true);
? searcher.Versions[scoreDoc.Doc].GetVersions(onlyListed: true, includeSemVer2: includeSemVer2)
: searcher.Versions[scoreDoc.Doc].GetStableVersions(onlyListed: true, includeSemVer2: includeSemVer2);

foreach (var version in versions)
{
Expand Down
4 changes: 2 additions & 2 deletions src/NuGet.Indexing/ServiceImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public static void Search(JsonWriter jsonWriter,

TopDocs topDocs = searcher.Search(query, skip + take);

ResponseFormatter.WriteSearchResult(jsonWriter, searcher, scheme, topDocs, skip, take, includePrerelease, includeExplanation, query);
ResponseFormatter.WriteSearchResult(jsonWriter, searcher, scheme, topDocs, skip, take, includePrerelease, includeExplanation, semVerLevel, query);
}
finally
{
Expand Down Expand Up @@ -92,7 +92,7 @@ public static void AutoComplete(
}

TopDocs topDocs = searcher.Search(query, 1);
ResponseFormatter.WriteAutoCompleteVersionResult(jsonWriter, searcher, includePrerelease, topDocs);
ResponseFormatter.WriteAutoCompleteVersionResult(jsonWriter, searcher, includePrerelease, semVerLevel, topDocs);
}
}
finally
Expand Down
1 change: 1 addition & 0 deletions src/NuGet.Indexing/VersionDetail.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ public class VersionDetail
public int Downloads { get; set; }
public bool IsStable { get; set; }
public bool IsListed { get; set; }
public bool IsSemVer2 { get; set; }
}
}
30 changes: 23 additions & 7 deletions src/NuGet.Indexing/VersionResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,37 @@ public class VersionResult
{
public VersionResult()
{
VersionDetails = new List<VersionDetail>();
AllVersionDetails = new List<VersionDetail>();
}

public List<VersionDetail> VersionDetails { get; private set; }
public List<VersionDetail> AllVersionDetails { get; private set; }

public IEnumerable<string> GetVersions(bool onlyListed)
public IEnumerable<VersionDetail> SemVer2VersionDetails { get { return AllVersionDetails; } }

public IEnumerable<VersionDetail> LegacyVersionDetails { get { return AllVersionDetails.Where(v => !v.IsSemVer2); } }

public IEnumerable<string> GetVersions(bool onlyListed, bool includeSemVer2)
{
return VersionDetails.Where(v => !onlyListed || v.IsListed).Select(v => v.Version);
if (includeSemVer2)
{
return SemVer2VersionDetails.Where(v => !onlyListed || v.IsListed).Select(v => v.Version);
}

return LegacyVersionDetails.Where(v => !onlyListed || v.IsListed).Select(v => v.Version);
}

public IEnumerable<string> GetStableVersions(bool onlyListed)
public IEnumerable<string> GetStableVersions(bool onlyListed, bool includeSemVer2)
{
return StableVersionDetails.Where(v => !onlyListed || v.IsListed).Select(v => v.Version);
if (includeSemVer2)
{
return StableSemVer2VersionDetails.Where(v => !onlyListed || v.IsListed).Select(v => v.Version);
}

return StableLegacyVersionDetails.Where(v => !onlyListed || v.IsListed).Select(v => v.Version);
}

public IEnumerable<VersionDetail> StableVersionDetails { get { return VersionDetails.Where(v => v.IsStable); } }
public IEnumerable<VersionDetail> StableLegacyVersionDetails { get { return AllVersionDetails.Where(v => v.IsStable && !v.IsSemVer2); } }

public IEnumerable<VersionDetail> StableSemVer2VersionDetails { get { return AllVersionDetails.Where(v => v.IsStable); } }
}
}
1 change: 1 addition & 0 deletions tests/NuGet.IndexingTests/NuGet.IndexingTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TestSupport\TokenAttributes.cs" />
<Compile Include="TestSupport\TokenStreamExtensions.cs" />
<Compile Include="VersionResultTests.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
Expand Down
4 changes: 2 additions & 2 deletions tests/NuGet.IndexingTests/ResponseFormatterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public void WriteAutoCompleteVersionResultTest(

using (var writer = new JsonTextWriter(sw))
{
ResponseFormatter.WriteAutoCompleteVersionResult(writer, searcher, includePrerelease, topDocs);
ResponseFormatter.WriteAutoCompleteVersionResult(writer, searcher, includePrerelease, SemVerHelpers.SemVer2Level, topDocs);

Assert.Equal(string.Format(expected, searcher.LastReopen), sb.ToString());
}
Expand Down Expand Up @@ -166,7 +166,7 @@ public void WriteSearchResultTest(

using (var writer = new JsonTextWriter(sw))
{
ResponseFormatter.WriteSearchResult(writer, searcher, Constants.SchemeName, topDocs, skip, take, includePrerelease, includeExplanation, NuGetQuery.MakeQuery("test"));
ResponseFormatter.WriteSearchResult(writer, searcher, Constants.SchemeName, topDocs, skip, take, includePrerelease, includeExplanation, SemVerHelpers.SemVer2Level, NuGetQuery.MakeQuery("test"));

Assert.Equal(string.Format(expected,
Constants.BaseUri,
Expand Down
Loading

0 comments on commit d7c8be1

Please sign in to comment.