|
@@ -74,7 +74,7 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
|
|
|
|
|
isErrorOccuredOnSearching: boolean | null
|
|
isErrorOccuredOnSearching: boolean | null
|
|
|
|
|
|
|
|
- fullTextSearchDelegator: any & SearchDelegator
|
|
|
|
|
|
|
+ fullTextSearchDelegator: any & ElasticsearchDelegator
|
|
|
|
|
|
|
|
nqDelegators: {[key in SearchDelegatorName]: SearchDelegator}
|
|
nqDelegators: {[key in SearchDelegatorName]: SearchDelegator}
|
|
|
|
|
|
|
@@ -124,10 +124,10 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
logger.info('No elasticsearch URI is specified so that full text search is disabled.');
|
|
logger.info('No elasticsearch URI is specified so that full text search is disabled.');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- generateNQDelegators(defaultDelegator: SearchDelegator): {[key in SearchDelegatorName]: SearchDelegator} {
|
|
|
|
|
|
|
+ generateNQDelegators(defaultDelegator: ElasticsearchDelegator): {[key in SearchDelegatorName]: SearchDelegator} {
|
|
|
return {
|
|
return {
|
|
|
[SearchDelegatorName.DEFAULT]: defaultDelegator,
|
|
[SearchDelegatorName.DEFAULT]: defaultDelegator,
|
|
|
- [SearchDelegatorName.PRIVATE_LEGACY_PAGES]: new PrivateLegacyPagesDelegator(),
|
|
|
|
|
|
|
+ [SearchDelegatorName.PRIVATE_LEGACY_PAGES]: new PrivateLegacyPagesDelegator() as SearchDelegator,
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -218,12 +218,14 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
return this.fullTextSearchDelegator.rebuildIndex();
|
|
return this.fullTextSearchDelegator.rebuildIndex();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- async parseSearchQuery(_queryString: string): Promise<ParsedQuery> {
|
|
|
|
|
|
|
+ // TODO: https://redmine.weseek.co.jp/issues/92049 No need to parseNQString anymore
|
|
|
|
|
+ async parseSearchQuery(queryString: string, nqName: string | null): Promise<ParsedQuery> {
|
|
|
|
|
+ // eslint-disable-next-line no-param-reassign
|
|
|
|
|
+ queryString = normalizeQueryString(queryString);
|
|
|
|
|
+
|
|
|
const regexp = new RegExp(/^\[nq:.+\]$/g); // https://regex101.com/r/FzDUvT/1
|
|
const regexp = new RegExp(/^\[nq:.+\]$/g); // https://regex101.com/r/FzDUvT/1
|
|
|
const replaceRegexp = new RegExp(/\[nq:|\]/g);
|
|
const replaceRegexp = new RegExp(/\[nq:|\]/g);
|
|
|
|
|
|
|
|
- const queryString = normalizeQueryString(_queryString);
|
|
|
|
|
-
|
|
|
|
|
// when Normal Query
|
|
// when Normal Query
|
|
|
if (!regexp.test(queryString)) {
|
|
if (!regexp.test(queryString)) {
|
|
|
return { queryString, terms: this.parseQueryString(queryString) };
|
|
return { queryString, terms: this.parseQueryString(queryString) };
|
|
@@ -251,35 +253,30 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
return parsedQuery;
|
|
return parsedQuery;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- async resolve(parsedQuery: ParsedQuery): Promise<[SearchDelegator, SearchableData | null]> {
|
|
|
|
|
- const { queryString, terms, delegatorName } = parsedQuery;
|
|
|
|
|
- if (delegatorName != null) {
|
|
|
|
|
- const nqDelegator = this.nqDelegators[delegatorName];
|
|
|
|
|
- if (nqDelegator != null) {
|
|
|
|
|
- return [nqDelegator, null];
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ async resolve(parsedQuery: ParsedQuery): Promise<[SearchDelegator, SearchableData]> {
|
|
|
|
|
+ const { queryString, terms, delegatorName = SearchDelegatorName.DEFAULT } = parsedQuery;
|
|
|
|
|
+ const nqDeledator = this.nqDelegators[delegatorName];
|
|
|
|
|
|
|
|
const data = {
|
|
const data = {
|
|
|
queryString,
|
|
queryString,
|
|
|
- terms: terms as QueryTerms,
|
|
|
|
|
|
|
+ terms,
|
|
|
};
|
|
};
|
|
|
- return [this.nqDelegators[SearchDelegatorName.DEFAULT], data];
|
|
|
|
|
|
|
+ return [nqDeledator, data];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- async searchKeyword(keyword: string, user, userGroups, searchOpts): Promise<[ISearchResult<unknown>, string]> {
|
|
|
|
|
- let parsedQuery;
|
|
|
|
|
|
|
+ async searchKeyword(keyword: string, nqName: string | null, user, userGroups, searchOpts): Promise<[ISearchResult<unknown>, string | null]> {
|
|
|
|
|
+ let parsedQuery: ParsedQuery;
|
|
|
// parse
|
|
// parse
|
|
|
try {
|
|
try {
|
|
|
- parsedQuery = await this.parseSearchQuery(keyword);
|
|
|
|
|
|
|
+ parsedQuery = await this.parseSearchQuery(keyword, nqName);
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
logger.error('Error occurred while parseSearchQuery', err);
|
|
logger.error('Error occurred while parseSearchQuery', err);
|
|
|
throw err;
|
|
throw err;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- let delegator;
|
|
|
|
|
- let data;
|
|
|
|
|
|
|
+ let delegator: SearchDelegator;
|
|
|
|
|
+ let data: SearchableData;
|
|
|
// resolve
|
|
// resolve
|
|
|
try {
|
|
try {
|
|
|
[delegator, data] = await this.resolve(parsedQuery);
|
|
[delegator, data] = await this.resolve(parsedQuery);
|
|
@@ -289,7 +286,7 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
throw err;
|
|
throw err;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return [await delegator.search(data, user, userGroups, searchOpts), delegator.name];
|
|
|
|
|
|
|
+ return [await delegator.search(data, user, userGroups, searchOpts), delegator.name ?? null];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
parseQueryString(queryString: string): QueryTerms {
|
|
parseQueryString(queryString: string): QueryTerms {
|