@@ -33,6 +33,7 @@ class CouchSearchProvider {
33
33
#bulkPromise;
34
34
#batchIds;
35
35
#lastAbortSignal;
36
+ #isSearchByNameViewDefined;
36
37
/**
37
38
*
38
39
* @param {import('./CouchObjectProvider').default } couchObjectProvider
@@ -70,19 +71,45 @@ class CouchSearchProvider {
70
71
}
71
72
}
72
73
73
- searchForObjects ( query , abortSignal ) {
74
+ #isOptimizedSearchByNameSupported( ) {
75
+ if ( this . #isSearchByNameViewDefined === undefined ) {
76
+ return ( this . #isSearchByNameViewDefined = this . couchObjectProvider . isViewDefined (
77
+ 'object_names' ,
78
+ 'object_names'
79
+ ) ) ;
80
+ } else {
81
+ return this . #isSearchByNameViewDefined;
82
+ }
83
+ }
84
+
85
+ async searchForObjects ( query , abortSignal ) {
74
86
const preparedQuery = query . toLowerCase ( ) . trim ( ) ;
75
- return this . couchObjectProvider . getObjectsByView (
76
- {
77
- designDoc : 'object_names' ,
78
- viewName : 'object_names' ,
79
- startKey : preparedQuery ,
80
- endKey : preparedQuery + '\\ufff0' ,
81
- objectIdField : 'value' ,
82
- limit : 1000
83
- } ,
84
- abortSignal
85
- ) ;
87
+ const supportsOptimizedSearchByName = await this . #isOptimizedSearchByNameSupported( ) ;
88
+
89
+ if ( supportsOptimizedSearchByName ) {
90
+ return this . couchObjectProvider . getObjectsByView (
91
+ {
92
+ designDoc : 'object_names' ,
93
+ viewName : 'object_names' ,
94
+ startKey : preparedQuery ,
95
+ endKey : preparedQuery + '\\ufff0' ,
96
+ objectIdField : 'value' ,
97
+ limit : 1000
98
+ } ,
99
+ abortSignal
100
+ ) ;
101
+ } else {
102
+ const filter = {
103
+ selector : {
104
+ model : {
105
+ name : {
106
+ $regex : `(?i)${ query } `
107
+ }
108
+ }
109
+ }
110
+ } ;
111
+ return this . couchObjectProvider . getObjectsByFilter ( filter ) ;
112
+ }
86
113
}
87
114
88
115
async #deferBatchAnnotationSearch( ) {
0 commit comments