diff --git a/OurUmbraco.Site/Views/Partials/Projects/ListProjects.cshtml b/OurUmbraco.Site/Views/Partials/Projects/ListProjects.cshtml index 776740d5..3c780c44 100644 --- a/OurUmbraco.Site/Views/Partials/Projects/ListProjects.cshtml +++ b/OurUmbraco.Site/Views/Partials/Projects/ListProjects.cshtml @@ -55,7 +55,6 @@ var toVersion = new Version(parsedVersion.Major, 999, 999).GetNumericalValue(); var versionFilters = new SearchFilters(BooleanOperation.Or); versionFilters.Filters.Add(new RangeSearchFilter("num_version", fromVersion, toVersion)); - versionFilters.Filters.Add(new RangeSearchFilter("num_compatVersions", fromVersion, toVersion)); filters.Add(versionFilters); } } diff --git a/OurUmbraco.Site/macroScripts/repository-popularpackages.cshtml b/OurUmbraco.Site/macroScripts/repository-popularpackages.cshtml index c8e38cc4..f7a7b3b5 100644 --- a/OurUmbraco.Site/macroScripts/repository-popularpackages.cshtml +++ b/OurUmbraco.Site/macroScripts/repository-popularpackages.cshtml @@ -33,7 +33,6 @@ var numericalVersion = parsedVersion.GetNumericalValue(); var versionFilters = new SearchFilters(BooleanOperation.Or); versionFilters.Filters.Add(new RangeSearchFilter("num_version", 0, numericalVersion)); - versionFilters.Filters.Add(new RangeSearchFilter("num_compatVersions", 0, numericalVersion)); filters.Add(versionFilters); } diff --git a/OurUmbraco/Our/Api/SearchController.cs b/OurUmbraco/Our/Api/SearchController.cs index ed55e02d..b06d7868 100644 --- a/OurUmbraco/Our/Api/SearchController.cs +++ b/OurUmbraco/Our/Api/SearchController.cs @@ -38,7 +38,6 @@ namespace OurUmbraco.Our.Api var numericalVersion = parsedVersion.GetNumericalValue(); var versionFilters = new SearchFilters(BooleanOperation.Or); versionFilters.Filters.Add(new RangeSearchFilter("num_version", 0, numericalVersion)); - versionFilters.Filters.Add(new RangeSearchFilter("num_compatVersions", 0, numericalVersion)); filters.Add(versionFilters); } } diff --git a/OurUmbraco/Our/Examine/ProjectNodeIndexDataService.cs b/OurUmbraco/Our/Examine/ProjectNodeIndexDataService.cs index 05accdaa..534aebe7 100644 --- a/OurUmbraco/Our/Examine/ProjectNodeIndexDataService.cs +++ b/OurUmbraco/Our/Examine/ProjectNodeIndexDataService.cs @@ -9,6 +9,7 @@ using Examine.LuceneEngine; using Examine.LuceneEngine.Providers; using Lucene.Net.Documents; using OurUmbraco.Project; +using OurUmbraco.Repository.Services; using OurUmbraco.Wiki.BusinessLogic; using umbraco; using Umbraco.Core; @@ -34,15 +35,8 @@ namespace OurUmbraco.Our.Examine var isLive = project.GetPropertyValue("projectLive"); var isApproved = project.GetPropertyValue("approved"); - var minimumVersionStrict = string.Empty; - var currentFileId = project.GetPropertyValue("file"); - if (currentFileId > 0) - { - var currentFile = files.FirstOrDefault(x => x.Id == currentFileId); - if (currentFile != null) - minimumVersionStrict = currentFile.MinimumVersionStrict; - } - + var strictPackageFiles = PackageRepositoryService.GetAllStrictSupportedPackageVersions(files); + simpleDataSet.NodeDefinition.NodeId = project.Id; simpleDataSet.NodeDefinition.Type = indexType; @@ -54,8 +48,7 @@ namespace OurUmbraco.Our.Examine simpleDataSet.RowData.Add("nodeTypeAlias", "project"); simpleDataSet.RowData.Add("url", project.Url); simpleDataSet.RowData.Add("uniqueId", project.GetPropertyValue("packageGuid")); - simpleDataSet.RowData.Add("worksOnUaaS", project.GetPropertyValue("worksOnUaaS")); - simpleDataSet.RowData.Add("minimumVersionStrict", minimumVersionStrict); + simpleDataSet.RowData.Add("worksOnUaaS", project.GetPropertyValue("worksOnUaaS")); var imageFile = string.Empty; if (project.HasValue("defaultScreenshotPath")) @@ -75,37 +68,14 @@ namespace OurUmbraco.Our.Examine // so we have to do all of this parsing. var version = project.GetPropertyValue("compatibleVersions") ?? string.Empty; var cleanedVersions = version.ToLower() - .Replace("nan", "") - .Replace("saved", "") - .Replace("v", "") .Trim(',') .Split(',') - //it's stored as an int like 721 (for version 7.2.1) - .Where(x => x.Length <= 3 && x.Length > 0) - //pad it out to 3 digits - .Select(x => x.PadRight(3, '0')) - .Select(x => - { - int o; - if (int.TryParse(x, out o)) - { - //if it ends with '0', that means it's a X.X.X version - // if it does not end with '0', that means that the last 2 digits are the - // Minor part of the version - return x.EndsWith("0") - ? string.Format("{0}.{1}.{2}", x[0], x[1], 0) - : string.Format("{0}.{1}.{2}", x[0], x.Substring(1), 0); - } - return null; - }) + .Select(x => x.GetFromUmbracoString(reduceToConfigured:false)) .Where(x => x != null); - var cleanedCompatVersions = compatVersions.Select(x => x.Replace("nan", "") - .Replace("saved", "") - .Replace("nan", "") - .Replace("v", "") - .Replace(".x", "") - .Trim(',')); + var cleanedCompatVersions = compatVersions + .Select(x => x.GetFromUmbracoString(reduceToConfigured: false)) + .Where(x => x != null); //popularity for sorting number = downloads + karma * 100; //TODO: Change score so that we take into account: @@ -136,6 +106,8 @@ namespace OurUmbraco.Our.Examine //then we index the versions that the project has actually been flagged as compatible against simpleDataSet.RowData.Add("compatVersions", string.Join(",", cleanedCompatVersions)); + simpleDataSet.RowData.Add("minimumVersionStrict", string.Join(",", strictPackageFiles.Select(x => x.MinUmbracoVersion.ToString(3)))); + return simpleDataSet; } @@ -193,7 +165,7 @@ namespace OurUmbraco.Our.Examine foreach (var numericalVersion in numericalVersions) { //don't store, we're just using this to search - var versionField = new NumericField(fieldName, Field.Store.NO, true).SetLongValue(numericalVersion); + var versionField = new NumericField(fieldName, Field.Store.YES, true).SetLongValue(numericalVersion); e.Document.Add(versionField); } } @@ -219,50 +191,39 @@ namespace OurUmbraco.Our.Examine e.Document.Add(new Field("body", e.Fields["body"].StripHtml(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES)); } - //If there is a versions field, we'll split it and index the same field on each version - if (e.Fields.ContainsKey("versions")) + var allVersions = new HashSet(); + + //each of these contains versions, we want to parse them all into one list and then ensure each of these + //fields are not analyzed (just stored since we dont use them for searching) + var delimitedVersionFields = new[] {"versions", "minimumVersionStrict", "compatVersions"}; + + foreach (var fieldName in delimitedVersionFields) { - //split into separate versions - var versions = e.Fields["versions"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - - AddNumericalVersionValue(e, "num_versions", versions); - - //remove the current version field from the lucene doc - e.Document.RemoveField("versions"); - - foreach (var version in versions) + //If there is a versions field, we'll split it and index the same field on each version + if (e.Fields.ContainsKey(fieldName)) { - //add a 'versions' field for each version (same field name but different values) - //not analyzed, we don't use this for searching - e.Document.Add(new Field("versions", version, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO)); - } - } - - //add the minimumVersionStrict as a version too - if (e.Fields.ContainsKey("minimumVersionStrict")) - { - AddNumericalVersionValue(e, "num_versions", new[] {e.Fields["minimumVersionStrict"]}); - } - - //If there is a compatVersions field, we'll split it and index the same field on each version - if (e.Fields.ContainsKey("compatVersions")) - { - //split into separate versions - var compatVersions = e.Fields["compatVersions"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - - AddNumericalVersionValue(e, "num_compatVersions", compatVersions); - - //remove the current compatVersions field from the lucene doc - e.Document.RemoveField("compatVersions"); - - foreach (var version in compatVersions) - { - //add a 'compatVersions' field for each compatVersion (same field name but different values) - //not analyzed, we don't use this for searching - e.Document.Add(new Field("compatVersions", version, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO)); + //split into separate versions + var versions = e.Fields[fieldName].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + + foreach (var version in versions) + { + allVersions.Add(version); + } + + //remove the current version field from the lucene doc + e.Document.RemoveField(fieldName); + + foreach (var version in versions) + { + //add a 'versions' field for each version (same field name but different values) + //not analyzed, we don't use this for searching + e.Document.Add(new Field(fieldName, version, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO)); + } } } + //now add all versions to a numerical field + AddNumericalVersionValue(e, "num_version", allVersions.ToArray()); } diff --git a/OurUmbraco/Project/Controllers/RepositoryController.cs b/OurUmbraco/Project/Controllers/RepositoryController.cs index 136bcfb4..b67b74f7 100644 --- a/OurUmbraco/Project/Controllers/RepositoryController.cs +++ b/OurUmbraco/Project/Controllers/RepositoryController.cs @@ -31,7 +31,6 @@ namespace OurUmbraco.Project.Controllers var numericalVersion = parsedVersion.GetNumericalValue(); var versionFilters = new SearchFilters(BooleanOperation.Or); versionFilters.Filters.Add(new RangeSearchFilter("num_version", 0, numericalVersion)); - versionFilters.Filters.Add(new RangeSearchFilter("num_compatVersions", 0, numericalVersion)); filters.Add(versionFilters); } } diff --git a/OurUmbraco/Project/ProjectExtensions.cs b/OurUmbraco/Project/ProjectExtensions.cs index 4b31481f..0ced75a5 100644 --- a/OurUmbraco/Project/ProjectExtensions.cs +++ b/OurUmbraco/Project/ProjectExtensions.cs @@ -23,7 +23,7 @@ namespace OurUmbraco.Project /// public static System.Version GetFromUmbracoString(this string version, bool reduceToConfigured = true) { - if (string.IsNullOrWhiteSpace(version)) throw new ArgumentException("Value cannot be null or whitespace.", "version"); + if (string.IsNullOrWhiteSpace(version)) return null; //need to clean up this string, it could be all sorts of things version = version.ToLower() diff --git a/OurUmbraco/Repository/Services/PackageRepositoryService.cs b/OurUmbraco/Repository/Services/PackageRepositoryService.cs index 98fb60c8..dd4c4673 100644 --- a/OurUmbraco/Repository/Services/PackageRepositoryService.cs +++ b/OurUmbraco/Repository/Services/PackageRepositoryService.cs @@ -96,13 +96,16 @@ namespace OurUmbraco.Repository.Services if (version.IsNullOrWhiteSpace() == false) { //need to clean up this string, it could be all sorts of things - var parsedVersion = version.GetFromUmbracoString(); + var parsedVersion = version.GetFromUmbracoString(reduceToConfigured: false); if (parsedVersion != null) { var numericalVersion = parsedVersion.GetNumericalValue(); var versionFilters = new SearchFilters(BooleanOperation.Or); - versionFilters.Filters.Add(new RangeSearchFilter("num_version", 0, numericalVersion)); - versionFilters.Filters.Add(new RangeSearchFilter("num_compatVersions", 0, numericalVersion)); + + //search for all versions from the current major to the version passed in + var currMajor = new System.Version(parsedVersion.Major, 0, 0).GetNumericalValue(); + + versionFilters.Filters.Add(new RangeSearchFilter("num_version", currMajor, numericalVersion)); filters.Add(versionFilters); } } @@ -337,7 +340,7 @@ namespace OurUmbraco.Repository.Services private IEnumerable GetAllFilePackageVersions(IEnumerable packages) { var allVersions = packages - .Select(x => ConvertToVersion(x.Version.Version)) + .Select(x => x.Version.Version.GetFromUmbracoString(reduceToConfigured: false)) .WhereNotNull() .Distinct() .OrderBy(x => x) @@ -354,11 +357,11 @@ namespace OurUmbraco.Repository.Services /// Order from latest package version and lastest min umb version and start from the top, we want to return the most recent /// available package version for the current Umbraco version /// - private IEnumerable GetAllStrictSupportedPackageVersions(IEnumerable packages) + internal static IEnumerable GetAllStrictSupportedPackageVersions(IEnumerable packages) { var allVersions = packages .Where(x => x.MinimumVersionStrict.IsNullOrWhiteSpace() == false) - .Select(x => new PackageVersionSupport(x.Id, ConvertToVersion(x.Version.Version), ConvertToVersion(x.MinimumVersionStrict))) + .Select(x => new PackageVersionSupport(x.Id, x.Version.Version.GetFromUmbracoString(reduceToConfigured: false), x.MinimumVersionStrict.GetFromUmbracoString(reduceToConfigured: false))) .Where(x => x.PackageVersion != null && x.MinUmbracoVersion != null) .OrderByDescending(x => x.PackageVersion) .ThenByDescending(x => x.MinUmbracoVersion) @@ -378,47 +381,12 @@ namespace OurUmbraco.Repository.Services { var allVersions = packages .Where(x => x.MinimumVersionStrict.IsNullOrWhiteSpace()) - .Select(x => new PackageVersionSupport(x.Id, ConvertToVersion(x.Version.Version), null)) + .Select(x => new PackageVersionSupport(x.Id, x.Version.Version.GetFromUmbracoString(reduceToConfigured:false), null)) .Where(x => x.PackageVersion != null) .OrderByDescending(x => x.PackageVersion) .ToArray(); return allVersions; - } - - - - /// - /// Try to convert the string to a real version based on legacy version formats - /// - /// - /// - private System.Version ConvertToVersion(string ver) - { - string normalized = ver; - if (ver.InvariantStartsWith("v")) - { - if (ver.InvariantStartsWith("v4")) - { - normalized = string.Concat(ver.Replace("v4", "4."), ".0"); - } - else - { - normalized = string.Join(".", ver.ToCharArray().Skip(1)); - } - } - - if (normalized.EndsWith(".x")) - { - normalized = normalized.TrimEnd(".x").EnsureEndsWith(".0"); - } - - System.Version result; - if (System.Version.TryParse(normalized, out result)) - { - return result; - } - return null; - } + } private PackageOwnerInfo GetPackageOwnerInfo(int ownerId, bool openForCollab, int contentId) {