|
|
@@ -12,6 +12,7 @@ import { DefaultSearchPluginInitOptions, SearchInput } from '../types';
|
|
|
|
|
|
import { SearchStrategy } from './search-strategy';
|
|
|
import {
|
|
|
+ applyLanguageConstraints,
|
|
|
createCollectionIdCountMap,
|
|
|
createFacetIdCountMap,
|
|
|
createPlaceholderFromId,
|
|
|
@@ -40,12 +41,12 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
const facetValuesQb = this.connection
|
|
|
.getRepository(ctx, SearchIndexItem)
|
|
|
.createQueryBuilder('si')
|
|
|
- .select(['productId', 'productVariantId'])
|
|
|
+ .select(['si.productId', 'si.productVariantId'])
|
|
|
.addSelect('GROUP_CONCAT(si.facetValueIds)', 'facetValues');
|
|
|
|
|
|
this.applyTermAndFilters(ctx, facetValuesQb, input);
|
|
|
if (!input.groupByProduct) {
|
|
|
- facetValuesQb.groupBy('productVariantId');
|
|
|
+ facetValuesQb.groupBy('si.productVariantId');
|
|
|
}
|
|
|
if (enabledOnly) {
|
|
|
facetValuesQb.andWhere('si.enabled = :enabled', { enabled: true });
|
|
|
@@ -62,12 +63,12 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
const collectionsQb = this.connection
|
|
|
.getRepository(ctx, SearchIndexItem)
|
|
|
.createQueryBuilder('si')
|
|
|
- .select(['productId', 'productVariantId'])
|
|
|
+ .select(['si.productId', 'si.productVariantId'])
|
|
|
.addSelect('GROUP_CONCAT(si.collectionIds)', 'collections');
|
|
|
|
|
|
this.applyTermAndFilters(ctx, collectionsQb, input);
|
|
|
if (!input.groupByProduct) {
|
|
|
- collectionsQb.groupBy('productVariantId');
|
|
|
+ collectionsQb.groupBy('si.productVariantId');
|
|
|
}
|
|
|
if (enabledOnly) {
|
|
|
collectionsQb.andWhere('si.enabled = :enabled', { enabled: true });
|
|
|
@@ -86,9 +87,9 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
const sort = input.sort;
|
|
|
const qb = this.connection.getRepository(ctx, SearchIndexItem).createQueryBuilder('si');
|
|
|
if (input.groupByProduct) {
|
|
|
- qb.addSelect('MIN(price)', 'minPrice').addSelect('MAX(price)', 'maxPrice');
|
|
|
- qb.addSelect('MIN(priceWithTax)', 'minPriceWithTax').addSelect(
|
|
|
- 'MAX(priceWithTax)',
|
|
|
+ qb.addSelect('MIN(si.price)', 'minPrice').addSelect('MAX(si.price)', 'maxPrice');
|
|
|
+ qb.addSelect('MIN(si.priceWithTax)', 'minPriceWithTax').addSelect(
|
|
|
+ 'MAX(si.priceWithTax)',
|
|
|
'maxPriceWithTax',
|
|
|
);
|
|
|
}
|
|
|
@@ -98,13 +99,13 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
}
|
|
|
if (sort) {
|
|
|
if (sort.name) {
|
|
|
- qb.addOrderBy('productName', sort.name);
|
|
|
+ qb.addOrderBy('si.productName', sort.name);
|
|
|
}
|
|
|
if (sort.price) {
|
|
|
- qb.addOrderBy('price', sort.price);
|
|
|
+ qb.addOrderBy('si.price', sort.price);
|
|
|
}
|
|
|
} else {
|
|
|
- qb.addOrderBy('productVariantId', 'ASC');
|
|
|
+ qb.addOrderBy('si.productVariantId', 'ASC');
|
|
|
}
|
|
|
if (enabledOnly) {
|
|
|
qb.andWhere('si.enabled = :enabled', { enabled: true });
|
|
|
@@ -114,7 +115,10 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
.take(take)
|
|
|
.skip(skip)
|
|
|
.getRawMany()
|
|
|
- .then(res => res.map(r => mapToSearchResult(r, ctx.channel.currencyCode)));
|
|
|
+ .then(res => {
|
|
|
+ // console.warn(qb.getQueryAndParameters(), "take", take, "skip", skip, "length", res.length)
|
|
|
+ return res.map(r => mapToSearchResult(r, ctx.channel.currencyCode))
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
async getTotalCount(ctx: RequestContext, input: SearchInput, enabledOnly: boolean): Promise<number> {
|
|
|
@@ -150,27 +154,27 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
// so we just use a weighted LIKE match
|
|
|
qb.addSelect(
|
|
|
`
|
|
|
- CASE WHEN sku LIKE :like_term THEN 10 ELSE 0 END +
|
|
|
- CASE WHEN productName LIKE :like_term THEN 3 ELSE 0 END +
|
|
|
- CASE WHEN productVariantName LIKE :like_term THEN 2 ELSE 0 END +
|
|
|
- CASE WHEN description LIKE :like_term THEN 1 ELSE 0 END`,
|
|
|
+ CASE WHEN si.sku LIKE :like_term THEN 10 ELSE 0 END +
|
|
|
+ CASE WHEN si.productName LIKE :like_term THEN 3 ELSE 0 END +
|
|
|
+ CASE WHEN si.productVariantName LIKE :like_term THEN 2 ELSE 0 END +
|
|
|
+ CASE WHEN si.description LIKE :like_term THEN 1 ELSE 0 END`,
|
|
|
'score',
|
|
|
)
|
|
|
.andWhere(
|
|
|
new Brackets(qb1 => {
|
|
|
- qb1.where('sku LIKE :like_term')
|
|
|
- .orWhere('productName LIKE :like_term')
|
|
|
- .orWhere('productVariantName LIKE :like_term')
|
|
|
- .orWhere('description LIKE :like_term');
|
|
|
+ qb1.where('si.sku LIKE :like_term')
|
|
|
+ .orWhere('si.productName LIKE :like_term')
|
|
|
+ .orWhere('si.productVariantName LIKE :like_term')
|
|
|
+ .orWhere('si.description LIKE :like_term');
|
|
|
}),
|
|
|
)
|
|
|
.setParameters({ term, like_term: `%${term}%` });
|
|
|
}
|
|
|
if (input.inStock != null) {
|
|
|
if (input.groupByProduct) {
|
|
|
- qb.andWhere('productInStock = :inStock', { inStock: input.inStock });
|
|
|
+ qb.andWhere('si.productInStock = :inStock', { inStock: input.inStock });
|
|
|
} else {
|
|
|
- qb.andWhere('inStock = :inStock', { inStock: input.inStock });
|
|
|
+ qb.andWhere('si.inStock = :inStock', { inStock: input.inStock });
|
|
|
}
|
|
|
}
|
|
|
if (facetValueIds?.length) {
|
|
|
@@ -178,7 +182,7 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
new Brackets(qb1 => {
|
|
|
for (const id of facetValueIds) {
|
|
|
const placeholder = createPlaceholderFromId(id);
|
|
|
- const clause = `(',' || facetValueIds || ',') LIKE :${placeholder}`;
|
|
|
+ const clause = `(',' || si.facetValueIds || ',') LIKE :${placeholder}`;
|
|
|
const params = { [placeholder]: `%,${id},%` };
|
|
|
if (facetValueOperator === LogicalOperator.AND) {
|
|
|
qb1.andWhere(clause, params);
|
|
|
@@ -200,14 +204,14 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
}
|
|
|
if (facetValueFilter.and) {
|
|
|
const placeholder = createPlaceholderFromId(facetValueFilter.and);
|
|
|
- const clause = `(',' || facetValueIds || ',') LIKE :${placeholder}`;
|
|
|
+ const clause = `(',' || si.facetValueIds || ',') LIKE :${placeholder}`;
|
|
|
const params = { [placeholder]: `%,${facetValueFilter.and},%` };
|
|
|
qb2.where(clause, params);
|
|
|
}
|
|
|
if (facetValueFilter.or?.length) {
|
|
|
for (const id of facetValueFilter.or) {
|
|
|
const placeholder = createPlaceholderFromId(id);
|
|
|
- const clause = `(',' || facetValueIds || ',') LIKE :${placeholder}`;
|
|
|
+ const clause = `(',' || si.facetValueIds || ',') LIKE :${placeholder}`;
|
|
|
const params = { [placeholder]: `%,${id},%` };
|
|
|
qb2.orWhere(clause, params);
|
|
|
}
|
|
|
@@ -219,20 +223,23 @@ export class SqliteSearchStrategy implements SearchStrategy {
|
|
|
);
|
|
|
}
|
|
|
if (collectionId) {
|
|
|
- qb.andWhere(`(',' || collectionIds || ',') LIKE :collectionId`, {
|
|
|
+ qb.andWhere(`(',' || si.collectionIds || ',') LIKE :collectionId`, {
|
|
|
collectionId: `%,${collectionId},%`,
|
|
|
});
|
|
|
}
|
|
|
if (collectionSlug) {
|
|
|
- qb.andWhere(`(',' || collectionSlugs || ',') LIKE :collectionSlug`, {
|
|
|
+ qb.andWhere(`(',' || si.collectionSlugs || ',') LIKE :collectionSlug`, {
|
|
|
collectionSlug: `%,${collectionSlug},%`,
|
|
|
});
|
|
|
}
|
|
|
- qb.andWhere('languageCode = :languageCode', { languageCode: ctx.languageCode });
|
|
|
- qb.andWhere('channelId = :channelId', { channelId: ctx.channelId });
|
|
|
+
|
|
|
+ applyLanguageConstraints(qb, ctx.languageCode, ctx.channel.defaultLanguageCode);
|
|
|
+ qb.andWhere('si.channelId = :channelId', { channelId: ctx.channelId });
|
|
|
+
|
|
|
if (input.groupByProduct === true) {
|
|
|
- qb.groupBy('productId');
|
|
|
+ qb.groupBy('si.productId');
|
|
|
}
|
|
|
+
|
|
|
return qb;
|
|
|
}
|
|
|
}
|