using System.Text; namespace OpenArchival.DataAccess; public static class ArtifactGroupingExtensions { /// /// Concatinates all data that can be searched on into large strings so that Postgres can turn them into search vectors /// /// public static void GenerateSearchIndex(this ArtifactGrouping grouping) { var allSearchSb = new StringBuilder(); var tagsSb = new StringBuilder(); var defectsSb = new StringBuilder(); var listedNamesSb = new StringBuilder(); var titlesSb = new StringBuilder(); var descriptionsSb = new StringBuilder(); var filenamesSb = new StringBuilder(); var fileContentSb = new StringBuilder(); // Put all the top level data in allSearchSb.Append($"{grouping.Title} "); titlesSb.Append($"{grouping.Title} "); allSearchSb.Append($"{grouping.Description} "); descriptionsSb.Append($"{grouping.Description} "); foreach (ArtifactEntry entry in grouping.ChildArtifactEntries) { allSearchSb.Append($"{entry.Title} "); titlesSb.Append($"{entry.Title} "); allSearchSb.Append($"{entry.Description} "); descriptionsSb.Append($"{entry.Description} "); foreach (ArtifactEntryTag tag in entry.Tags) { allSearchSb.Append($"{tag.Name} "); tagsSb.Append($"{tag.Name} "); } if (entry.Defects is not null) { foreach (ArtifactDefect defect in entry.Defects) { allSearchSb.Append($"{defect.Description} "); defectsSb.Append($"{defect.Description} "); } } if (entry.ListedNames is not null) { foreach (ListedName name in entry.ListedNames) { allSearchSb.Append($"{name.Value} "); listedNamesSb.Append($"{name.Value} "); } } foreach (FilePathListing file in entry.Files) { allSearchSb.Append($"{file.OriginalName} "); filenamesSb.Append($"{file.OriginalName} "); } fileContentSb.Append($"{entry.FileTextContent} "); allSearchSb.Append($"{entry.FileTextContent} "); } grouping.AllSearchString = allSearchSb.ToString(); grouping.TagsSearchString = tagsSb.ToString(); grouping.DefectsSearchString = defectsSb.ToString(); grouping.ListedNamesSearchString = listedNamesSb.ToString(); grouping.TitleSearchString = titlesSb.ToString(); grouping.DescriptionSearchString = descriptionsSb.ToString(); grouping.FilenamesSearchString = filenamesSb.ToString(); } }