|
@@ -1,13 +1,12 @@
|
|
|
import mongoose from 'mongoose';
|
|
import mongoose from 'mongoose';
|
|
|
import RE2 from 're2';
|
|
import RE2 from 're2';
|
|
|
|
|
|
|
|
-import { NamedQueryModel, NamedQueryDocument } from '../models/named-query';
|
|
|
|
|
|
|
+import { NamedQueryModel } from '../models/named-query';
|
|
|
import {
|
|
import {
|
|
|
SearchDelegator, SearchQueryParser, SearchResolver, ParsedQuery, Result, MetaData, SearchableData, QueryTerms,
|
|
SearchDelegator, SearchQueryParser, SearchResolver, ParsedQuery, Result, MetaData, SearchableData, QueryTerms,
|
|
|
} from '../interfaces/search';
|
|
} from '../interfaces/search';
|
|
|
|
|
|
|
|
import loggerFactory from '~/utils/logger';
|
|
import loggerFactory from '~/utils/logger';
|
|
|
-import { SearchDelegatorName } from '~/interfaces/named-query';
|
|
|
|
|
|
|
|
|
|
// eslint-disable-next-line no-unused-vars
|
|
// eslint-disable-next-line no-unused-vars
|
|
|
const logger = loggerFactory('growi:service:search');
|
|
const logger = loggerFactory('growi:service:search');
|
|
@@ -170,15 +169,16 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
|
|
|
|
|
const name = queryString.replace(replaceRegexp, '');
|
|
const name = queryString.replace(replaceRegexp, '');
|
|
|
const nq = await NamedQuery.findOne({ name });
|
|
const nq = await NamedQuery.findOne({ name });
|
|
|
|
|
+
|
|
|
if (nq == null) {
|
|
if (nq == null) {
|
|
|
- throw Error('Named Query not found.');
|
|
|
|
|
|
|
+ throw Error('Named query was not found.');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const { aliasOf, delegatorName } = nq;
|
|
const { aliasOf, delegatorName } = nq;
|
|
|
|
|
|
|
|
let parsedQuery;
|
|
let parsedQuery;
|
|
|
if (aliasOf != null) {
|
|
if (aliasOf != null) {
|
|
|
- parsedQuery = { queryString, terms: this.parseQueryString(aliasOf) };
|
|
|
|
|
|
|
+ parsedQuery = { queryString: normalizeQueryString(aliasOf), terms: this.parseQueryString(aliasOf) };
|
|
|
}
|
|
}
|
|
|
if (delegatorName != null) {
|
|
if (delegatorName != null) {
|
|
|
parsedQuery = { queryString, delegatorName };
|
|
parsedQuery = { queryString, delegatorName };
|
|
@@ -189,7 +189,6 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
|
|
|
|
|
async resolve(parsedQuery: ParsedQuery): Promise<[SearchDelegator, SearchableData | null]> {
|
|
async resolve(parsedQuery: ParsedQuery): Promise<[SearchDelegator, SearchableData | null]> {
|
|
|
const { queryString, terms, delegatorName } = parsedQuery;
|
|
const { queryString, terms, delegatorName } = parsedQuery;
|
|
|
-
|
|
|
|
|
if (delegatorName != null) {
|
|
if (delegatorName != null) {
|
|
|
const nqDelegator = this.nqDelegators[delegatorName];
|
|
const nqDelegator = this.nqDelegators[delegatorName];
|
|
|
if (nqDelegator != null) {
|
|
if (nqDelegator != null) {
|
|
@@ -197,19 +196,39 @@ class SearchService implements SearchQueryParser, SearchResolver {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (terms == null) {
|
|
|
|
|
+ throw Error('Either of terms or delegatorName must not be null');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const data = {
|
|
const data = {
|
|
|
queryString,
|
|
queryString,
|
|
|
- terms: this.parseQueryString(queryString),
|
|
|
|
|
|
|
+ terms,
|
|
|
};
|
|
};
|
|
|
return [this.delegator, data];
|
|
return [this.delegator, data];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async searchKeyword(keyword: string, user, userGroups, searchOpts): Promise<Result<any> & MetaData> {
|
|
async searchKeyword(keyword: string, user, userGroups, searchOpts): Promise<Result<any> & MetaData> {
|
|
|
|
|
+ let parsedQuery;
|
|
|
// parse
|
|
// parse
|
|
|
- const parsedQuery = await this.parseSearchQuery(keyword);
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ parsedQuery = await this.parseSearchQuery(keyword);
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ logger.error('Error occurred while parseSearchQuery', err);
|
|
|
|
|
+ throw err;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ let delegator;
|
|
|
|
|
+ let data;
|
|
|
// resolve
|
|
// resolve
|
|
|
- const [delegator, data] = await this.resolve(parsedQuery);
|
|
|
|
|
- // search
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ [delegator, data] = await this.resolve(parsedQuery);
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ logger.error('Error occurred while resolving search delegator', err);
|
|
|
|
|
+ throw err;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return delegator.search(data, user, userGroups, searchOpts);
|
|
return delegator.search(data, user, userGroups, searchOpts);
|
|
|
}
|
|
}
|
|
|
|
|
|