Improves logic for single word search to use Message Like expression - Thanks Dan Booth

Co-authored-by: Dan Booth <dan@diplo.co.uk>
Co-authored-by: Warren Buckley <warren@umbraco.com>
This commit is contained in:
Warren Buckley
2018-09-19 21:22:10 +01:00
parent b54998f0af
commit 2ed048e4e1

View File

@@ -10,6 +10,8 @@ namespace Umbraco.Core.Logging.Viewer
{
public abstract class LogViewerSourceBase : ILogViewer
{
private static readonly string expressionOperators = "()+=*<>%-";
public abstract IEnumerable<LogEvent> GetAllLogs(DateTimeOffset startDate, DateTimeOffset endDate);
public abstract IEnumerable<SavedLogSearch> GetSavedSearches();
@@ -57,39 +59,32 @@ namespace Umbraco.Core.Logging.Viewer
var allLogs = GetAllLogs(startDate, endDate);
var logs = allLogs;
//If we have a filter expression, apply it
//If we have a filter expression check it and apply
if (string.IsNullOrEmpty(filterExpression) == false)
{
Func<LogEvent, bool> filter = null;
// If the expression evaluates then make it into a filter
if (FilterLanguage.TryCreateFilter(filterExpression, out Func<LogEvent, object> eval, out string error))
// If the expression is one word and doesn't contain a serilog operator then we can perform a like search
if (!filterExpression.Contains(" ") && !filterExpression.ContainsAny(expressionOperators.Select(c => c)))
{
filter = evt => true.Equals(eval(evt));
}
else
{
//Assume the expression was a search string and make a Like filter from that
filter = PerformMessageLikeFilter(filterExpression);
}
//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)
else // check if it's a valid expression
{
//Reset logs & filter
logs = allLogs;
filter = null;
// If the expression evaluates then make it into a filter
if (FilterLanguage.TryCreateFilter(filterExpression, out Func<LogEvent, object> 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
filter = PerformMessageLikeFilter(filterExpression);
}
}
//Do an expression using message like
filter = PerformMessageLikeFilter(filterExpression);
//Filter the logs again with the single word
if (filter != null)
{
logs = FilterLogs(logs, filter);
}
}
@@ -110,7 +105,7 @@ namespace Umbraco.Core.Logging.Viewer
long pageIndex = pageNumber - 1;
//Order By, Skip, Take & Select
IEnumerable<LogMessage> logMessages = logs
var logMessages = logs
.OrderBy(l => l.Timestamp, orderDirection)
.Skip(pageSize * (pageNumber - 1))
.Take(pageSize)