From 9f5fe7ddfe6201054957c7190ad51780cb3d07ed Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Tue, 18 Sep 2018 21:50:31 +0100 Subject: [PATCH] Adds some logic if we get 0 results back and the search expression contains no spaces (we retry with a message like filter) Moves some of the logic into methods - as we end up reusing it --- .../Logging/Viewer/LogViewerSourceBase.cs | 56 +++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Core/Logging/Viewer/LogViewerSourceBase.cs b/src/Umbraco.Core/Logging/Viewer/LogViewerSourceBase.cs index ed3032d145..0c1358a143 100644 --- a/src/Umbraco.Core/Logging/Viewer/LogViewerSourceBase.cs +++ b/src/Umbraco.Core/Logging/Viewer/LogViewerSourceBase.cs @@ -54,30 +54,43 @@ namespace Umbraco.Core.Logging.Viewer string[] logLevels = null) { //Get all logs into memory (Not sure this good or not) - var logs = GetAllLogs(startDate, endDate); + var allLogs = GetAllLogs(startDate, endDate); + var logs = allLogs; //If we have a filter expression, apply it if (string.IsNullOrEmpty(filterExpression) == false) { Func filter = null; - + // If the expression evaluates then make it into a filter if (FilterLanguage.TryCreateFilter(filterExpression, out Func eval, out string error)) { filter = evt => true.Equals(eval(evt)); } - else // assume the expression was a search string and make a Like filter from that + else { - var filterSearch = $"@Message like '%{FilterLanguage.EscapeLikeExpressionContent(filterExpression)}%'"; - if (FilterLanguage.TryCreateFilter(filterSearch, out eval, out error)) - { - filter = evt => true.Equals(eval(evt)); - } + //Assume the expression was a search string and make a Like filter from that + filter = PerformMessageLikeFilter(filterExpression); } - - if (filter != null) + + //Go and filter the logs + //May be with a valid expression (could be single word & return no results) + //Failed expression so we try @Message like + logs = FilterLogs(logs, filter); + + //If logs now has a count of 0 AND filterExpression contains no spaces + //We can assume a single word search (Which would PASS creating a filter above) + if (logs.Count() == 0 && filterExpression.Contains(" ") == false) { - logs = logs.Where(filter); + //Reset logs & filter + logs = allLogs; + filter = null; + + //Do an expression using message like + filter = PerformMessageLikeFilter(filterExpression); + + //Filter the logs again with the single word + logs = FilterLogs(logs, filter); } } @@ -116,5 +129,26 @@ namespace Umbraco.Core.Logging.Viewer Items = logMessages }; } + + private Func PerformMessageLikeFilter(string filterExpression) + { + var filterSearch = $"@Message like '%{FilterLanguage.EscapeLikeExpressionContent(filterExpression)}%'"; + if (FilterLanguage.TryCreateFilter(filterSearch, out var eval, out var error)) + { + return evt => true.Equals(eval(evt)); + } + + return null; + } + + private IEnumerable FilterLogs(IEnumerable logs, Func filter) + { + if (filter != null) + { + logs = logs.Where(filter); + } + + return logs; + } } }