Taichi Masuyama 4 лет назад
Родитель
Сommit
161acd0b30
1 измененных файлов с 37 добавлено и 5 удалено
  1. 37 5
      packages/app/src/server/service/search.ts

+ 37 - 5
packages/app/src/server/service/search.ts

@@ -3,10 +3,11 @@ import RE2 from 're2';
 
 import { NamedQueryModel, NamedQueryDocument } from '../models/named-query';
 import {
-  SearchDelegator, SearchQueryParser, SearchResolver, ParsedQuery, Result, MetaData,
+  SearchDelegator, SearchQueryParser, SearchResolver, ParsedQuery, Result, MetaData, QueryTerms,
 } from '../interfaces/search';
 
 import loggerFactory from '~/utils/logger';
+import { SearchDelegatorName } from '~/interfaces/named-query';
 
 // eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:service:search');
@@ -23,6 +24,8 @@ class SearchService implements SearchQueryParser, SearchResolver {
 
   delegator: any & SearchDelegator
 
+  nqDelegators: {[delegatorName:string]: SearchDelegator} // TODO: initialize
+
   constructor(crowi) {
     this.crowi = crowi;
     this.configManager = crowi.configManager;
@@ -232,17 +235,46 @@ class SearchService implements SearchQueryParser, SearchResolver {
   }
 
   async resolve(parsedQuery: ParsedQuery): Promise<SearchDelegator> {
-    // TODO: impl resolve
-    return {} as SearchDelegator;
+    const { queryString, nqNames } = parsedQuery;
+
+    if (nqNames.length === 0) {
+      return this.delegator.search(queryString);
+    }
+
+    // find NamedQuery
+    const NamedQuery: NamedQueryModel = mongoose.model('NamedQuery');
+    const namedQueries = await NamedQuery.find({ name: { $in: nqNames } });
+
+    const delegatableNamedQuery = namedQueries.filter(nq => nq.delegatorName != null)[0]; // only the first named query is valid
+
+    if (delegatableNamedQuery == null) {
+      // expand aliasOf
+      // search with new qs
+    }
+
+    const nqDelegator = this.nqDelegators[delegatableNamedQuery.delegatorName as SearchDelegatorName];
+    if (nqDelegator != null) {
+      return nqDelegator.search(queryString);
+    }
+
+    return this.delegator.search();
   }
 
   async searchKeyword(keyword: string, user, userGroups, searchOpts): Promise<Result<any> & MetaData> {
-    // TODO: parse
-    // TODO: resolve
+    // parse
+    const parsedQuery = await this.parseSearchQuery(keyword);
+    // resolve
+    const delegator = await this.resolve(parsedQuery);
+
     // TODO: search
     return {} as Result<any> & MetaData;
   }
 
+  async parseAliasOf(namedQueries: NamedQueryDocument[]): QueryTerms {
+    const expandedAliasOf = namedQueries.map(nq => nq.aliasOf as string).reduce((a, b) => a + b);
+
+  }
+
 }
 
 export default SearchService;