Skip to content

Commit f32baec

Browse files
committed
Feature detect if views are defined to support optimized search. If not, fall back on filter-based search
1 parent f4ce138 commit f32baec

File tree

1 file changed

+39
-12
lines changed

1 file changed

+39
-12
lines changed

src/plugins/persistence/couch/CouchSearchProvider.js

+39-12
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class CouchSearchProvider {
3333
#bulkPromise;
3434
#batchIds;
3535
#lastAbortSignal;
36+
#isSearchByNameViewDefined;
3637
/**
3738
*
3839
* @param {import('./CouchObjectProvider').default} couchObjectProvider
@@ -70,19 +71,45 @@ class CouchSearchProvider {
7071
}
7172
}
7273

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) {
7486
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+
}
86113
}
87114

88115
async #deferBatchAnnotationSearch() {

0 commit comments

Comments
 (0)