Skip to content

Commit

Permalink
Implement file path exclusion search
Browse files Browse the repository at this point in the history
Fixes bug #55
  • Loading branch information
rpaquay committed Feb 10, 2020
1 parent 8854e6b commit 4f8cbbc
Showing 1 changed file with 29 additions and 3 deletions.
32 changes: 29 additions & 3 deletions src/Server/Search/SearchEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -334,16 +334,42 @@ private SearchPreProcessResult<T> PreProcessFileSystemNameSearch<T>(SearchParams
})
.ToReadOnlyCollection();

var matcher = new AnyPathMatcher(patterns.Select(PatternParser.ParsePattern));
// Split patterns into "include" and "exclude" patterns.
// "exclude" patterns are defined as any pattern starting with "-".
var includePatterns = patterns.Where(x => !x.StartsWith("-")).ToList();
var excludePatterns = patterns
.Except(includePatterns)
.Select(x => x.Substring(1))
.Where(x => !string.IsNullOrWhiteSpace(x))
.ToList();

// If no include pattern, assume implicit "*"
if (includePatterns.Count == 0) {
includePatterns.Add("*");
}
var includeMatcher = new AnyPathMatcher(includePatterns.Select(PatternParser.ParsePattern));

// Perf: Use "null" matcher if exclude pattern list is empty
var excludeMatcher = (excludePatterns.Count == 0 ?
null :
new AnyPathMatcher(excludePatterns.Select(PatternParser.ParsePattern)));

var comparer = searchParams.MatchCase ? PathComparerRegistry.CaseSensitive : PathComparerRegistry.CaseInsensitive;
if (patterns.Any(x => x.Contains(Path.DirectorySeparatorChar))) {
return new SearchPreProcessResult<T> {
Matcher = (item) => matchRelativeName(matcher, item, comparer)
Matcher = (item) => {
if (excludeMatcher != null && matchRelativeName(excludeMatcher, item, comparer))
return false;
return matchRelativeName(includeMatcher, item, comparer);
}
};
} else {
return new SearchPreProcessResult<T> {
Matcher = (item) => matchName(matcher, item, comparer)
Matcher = (item) => {
if (excludeMatcher != null && matchName(excludeMatcher, item, comparer))
return false;
return matchName(includeMatcher, item, comparer);
}
};
}
}
Expand Down

0 comments on commit 4f8cbbc

Please sign in to comment.