Browse Source

feat(server): Add sorting to search query

Michael Bromley 7 years ago
parent
commit
2baea0275d

+ 0 - 2
server/src/api/types/product.api.graphql

@@ -45,8 +45,6 @@ input ProductSortParameter {
     updatedAt: SortOrder
     name: SortOrder
     slug: SortOrder
-    description: SortOrder
-    image: SortOrder
 }
 
 input ProductFilterParameter {

+ 6 - 0
server/src/api/types/search.api.graphql

@@ -16,6 +16,12 @@ input SearchInput {
     groupByProduct: Boolean
     take: Int
     skip: Int
+    sort: SearchResultSortParameter
+}
+
+input SearchResultSortParameter {
+    name: SortOrder
+    price: SortOrder
 }
 
 type SearchResponse {

+ 9 - 0
server/src/plugin/default-search-plugin/search-strategy/mysql-search-strategy.ts

@@ -31,11 +31,20 @@ export class MysqlSearchStrategy implements SearchStrategy {
     async getSearchResults(ctx: RequestContext, input: SearchInput): Promise<SearchResult[]> {
         const take = input.take || 25;
         const skip = input.skip || 0;
+        const sort = input.sort;
         const qb = this.connection.getRepository(SearchIndexItem).createQueryBuilder('si');
         this.applyTermAndFilters(qb, input);
         if (input.term && input.term.length > this.minTermLength) {
             qb.orderBy('score', 'DESC');
         }
+        if (sort) {
+            if (sort.name) {
+                qb.addOrderBy('productName', sort.name);
+            }
+            if (sort.price) {
+                qb.addOrderBy('price', sort.price);
+            }
+        }
 
         return qb
             .take(take)

+ 10 - 0
server/src/plugin/default-search-plugin/search-strategy/postgres-search-strategy.ts

@@ -31,6 +31,7 @@ export class PostgresSearchStrategy implements SearchStrategy {
     async getSearchResults(ctx: RequestContext, input: SearchInput): Promise<SearchResult[]> {
         const take = input.take || 25;
         const skip = input.skip || 0;
+        const sort = input.sort;
         const qb = this.connection
             .getRepository(SearchIndexItem)
             .createQueryBuilder('si')
@@ -40,6 +41,15 @@ export class PostgresSearchStrategy implements SearchStrategy {
             qb.orderBy('score', 'DESC');
         }
 
+        if (sort) {
+            if (sort.name) {
+                qb.addOrderBy('"si_productName"', sort.name);
+            }
+            if (sort.price) {
+                qb.addOrderBy('"si_price"', sort.price);
+            }
+        }
+
         return qb
             .take(take)
             .skip(skip)

+ 9 - 0
server/src/plugin/default-search-plugin/search-strategy/sqlite-search-strategy.ts

@@ -32,11 +32,20 @@ export class SqliteSearchStrategy implements SearchStrategy {
     async getSearchResults(ctx: RequestContext, input: SearchInput): Promise<SearchResult[]> {
         const take = input.take || 25;
         const skip = input.skip || 0;
+        const sort = input.sort;
         const qb = this.connection.getRepository(SearchIndexItem).createQueryBuilder('si');
         this.applyTermAndFilters(qb, input);
         if (input.term && input.term.length > this.minTermLength) {
             qb.orderBy('score', 'DESC');
         }
+        if (sort) {
+            if (sort.name) {
+                qb.addOrderBy('productName', sort.name);
+            }
+            if (sort.price) {
+                qb.addOrderBy('price', sort.price);
+            }
+        }
 
         return await qb
             .take(take)

+ 10 - 5
shared/generated-types.ts

@@ -1,5 +1,5 @@
 // tslint:disable
-// Generated in 2019-02-14T14:24:26+01:00
+// Generated in 2019-02-15T09:00:52+01:00
 export type Maybe<T> = T | null;
 
 
@@ -347,10 +347,6 @@ export interface ProductSortParameter {
   name?: Maybe<SortOrder>;
   
   slug?: Maybe<SortOrder>;
-  
-  description?: Maybe<SortOrder>;
-  
-  image?: Maybe<SortOrder>;
 }
 
 export interface ProductFilterParameter {
@@ -445,6 +441,15 @@ export interface SearchInput {
   take?: Maybe<number>;
   
   skip?: Maybe<number>;
+  
+  sort?: Maybe<SearchResultSortParameter>;
+}
+
+export interface SearchResultSortParameter {
+  
+  name?: Maybe<SortOrder>;
+  
+  price?: Maybe<SortOrder>;
 }
 
 export interface ShippingMethodListOptions {