Browse Source

搜索优化

master
hejl 2 months ago
parent
commit
64ee70827a
  1. 29
      win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart
  2. 17
      win_text_editor/lib/modules/content_search/services/content_search_service.dart
  3. 4
      win_text_editor/lib/modules/content_search/widgets/results_view.dart
  4. 22
      win_text_editor/lib/modules/content_search/widgets/search_settings.dart

29
win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart

@ -20,6 +20,8 @@ class ContentSearchController extends BaseContentController {
bool _customRule = false; bool _customRule = false;
SearchMode _searchMode = SearchMode.locate; SearchMode _searchMode = SearchMode.locate;
final List<SearchResult> _results = []; final List<SearchResult> _results = [];
List<SearchResult> _allResults = [];
bool _includeZeroCounts = false;
// Getters // Getters
String get searchQuery => _searchQuery; String get searchQuery => _searchQuery;
@ -31,6 +33,7 @@ class ContentSearchController extends BaseContentController {
bool get customRule => _customRule; bool get customRule => _customRule;
SearchMode get searchMode => _searchMode; SearchMode get searchMode => _searchMode;
List<SearchResult> get results => _results; List<SearchResult> get results => _results;
bool get includeZeroCounts => _includeZeroCounts;
set customRule(bool value) { set customRule(bool value) {
_customRule = value; _customRule = value;
@ -86,11 +89,30 @@ class ContentSearchController extends BaseContentController {
void clearResults() { void clearResults() {
results.clear(); results.clear();
_allResults.clear();
notifyListeners(); notifyListeners();
} }
set includeZeroCounts(bool value) {
_includeZeroCounts = value;
_filterResults();
notifyListeners();
}
void _filterResults() {
_results.clear();
if (_searchMode == SearchMode.count) {
_results.addAll(
_includeZeroCounts ? _allResults : _allResults.where((r) => r.lineNumber > 0),
);
} else {
_results.addAll(_allResults);
}
}
Future<void> startSearch() async { Future<void> startSearch() async {
_results.clear(); _results.clear();
_allResults.clear();
// //
if (searchQuery.isEmpty) { if (searchQuery.isEmpty) {
@ -112,7 +134,7 @@ class ContentSearchController extends BaseContentController {
return; return;
} }
_results.addAll( _allResults.addAll(
await ContentSearchService.performCustomSearch( await ContentSearchService.performCustomSearch(
directory: searchDirectory, directory: searchDirectory,
fileType: fileType, fileType: fileType,
@ -123,7 +145,7 @@ class ContentSearchController extends BaseContentController {
} else { } else {
try { try {
if (searchMode == SearchMode.locate) { if (searchMode == SearchMode.locate) {
_results.addAll( _allResults.addAll(
await ContentSearchService.performLocateSearch( await ContentSearchService.performLocateSearch(
directory: searchDirectory, directory: searchDirectory,
query: searchQuery, query: searchQuery,
@ -144,7 +166,7 @@ class ContentSearchController extends BaseContentController {
); );
counts.forEach((keyword, count) { counts.forEach((keyword, count) {
_results.add( _allResults.add(
SearchResult( SearchResult(
filePath: keyword, filePath: keyword,
lineNumber: count, lineNumber: count,
@ -158,6 +180,7 @@ class ContentSearchController extends BaseContentController {
} catch (e) { } catch (e) {
Logger().error("搜索出错: $e"); Logger().error("搜索出错: $e");
} finally { } finally {
_filterResults();
notifyListeners(); notifyListeners();
} }
} }

17
win_text_editor/lib/modules/content_search/services/content_search_service.dart

@ -22,7 +22,7 @@ class ContentSearchService {
final results = <SearchResult>[]; final results = <SearchResult>[];
final dir = Directory(directory); final dir = Directory(directory);
final queries = _splitQuery(query); // final queries = _splitQuery(query); //
int speed = 0;
for (final q in queries) { for (final q in queries) {
final pattern = _buildSearchPattern( final pattern = _buildSearchPattern(
query: q, query: q,
@ -30,12 +30,15 @@ class ContentSearchService {
wholeWord: wholeWord, wholeWord: wholeWord,
useRegex: useRegex, useRegex: useRegex,
); );
Logger().info("搜索词 $q 开始[${++speed}/${queries.length}]");
int fileCount = 0;
await for (final entity in dir.list(recursive: true)) { await for (final entity in dir.list(recursive: true)) {
if (entity is File && _matchesFileType(entity.path, fileType)) { if (entity is File && _matchesFileType(entity.path, fileType)) {
fileCount++;
await _searchInFile(entity, pattern, results, q); // await _searchInFile(entity, pattern, results, q); //
} }
} }
Logger().info("搜索词 $q 结束[$speed/${queries.length}],搜索文件 $fileCount 个,");
} }
return results; return results;
@ -53,7 +56,7 @@ class ContentSearchService {
final counts = <String, int>{}; final counts = <String, int>{};
final dir = Directory(directory); final dir = Directory(directory);
final queries = _splitQuery(query); // final queries = _splitQuery(query); //
int speed = 0;
for (final q in queries) { for (final q in queries) {
final pattern = _buildSearchPattern( final pattern = _buildSearchPattern(
query: q, query: q,
@ -62,11 +65,17 @@ class ContentSearchService {
useRegex: useRegex, useRegex: useRegex,
); );
Logger().info("搜索词 $q 开始[${++speed}/${queries.length}]");
counts[q] = 0;
int fileCount = 0;
await for (final entity in dir.list(recursive: true)) { await for (final entity in dir.list(recursive: true)) {
if (entity is File && _matchesFileType(entity.path, fileType)) { if (entity is File && _matchesFileType(entity.path, fileType)) {
fileCount++;
await _countInFile(entity, pattern, counts, q); // await _countInFile(entity, pattern, counts, q); //
} }
} }
Logger().info("搜索词 $q 结束[$speed/${queries.length}],搜索文件 $fileCount 个,");
} }
return counts; return counts;
@ -266,7 +275,7 @@ class ContentSearchService {
} }
} }
} catch (e) { } catch (e) {
print('Error reading file ${file.path}: $e'); Logger().error('Error reading file ${file.path}: $e');
} }
} }

4
win_text_editor/lib/modules/content_search/widgets/results_view.dart

@ -110,7 +110,7 @@ class ResultsView extends StatelessWidget {
columns: [ columns: [
GridColumn( GridColumn(
columnName: 'file', columnName: 'file',
width: 300, minimumWidth: 300,
label: Container( label: Container(
alignment: Alignment.center, alignment: Alignment.center,
color: Colors.grey[200], color: Colors.grey[200],
@ -145,7 +145,7 @@ class ResultsView extends StatelessWidget {
columns: [ columns: [
GridColumn( GridColumn(
columnName: 'keyword', columnName: 'keyword',
width: 300, minimumWidth: 300,
label: Container( label: Container(
alignment: Alignment.center, alignment: Alignment.center,
color: Colors.grey[200], color: Colors.grey[200],

22
win_text_editor/lib/modules/content_search/widgets/search_settings.dart

@ -84,6 +84,28 @@ class SearchSettings extends StatelessWidget {
), ),
], ],
), ),
const SizedBox(height: 4),
Visibility(
visible: controller.searchMode == SearchMode.count,
child: Column(
children: [
CheckboxListTile(
dense: true,
contentPadding: EdgeInsets.zero,
controlAffinity: ListTileControlAffinity.leading,
title: const Text('包含匹配数量0', style: TextStyle(fontSize: 12)),
value: controller.includeZeroCounts,
onChanged:
controller.searchMode == SearchMode.count
? (value) {
controller.includeZeroCounts = value!;
}
: null,
),
const SizedBox(height: 4),
],
),
),
const SizedBox(height: 8), const SizedBox(height: 8),
// //
const Text('匹配规则:', style: TextStyle(fontSize: 12)), const Text('匹配规则:', style: TextStyle(fontSize: 12)),

Loading…
Cancel
Save