All Release Notes
Added Product Projection Search to GraphQL API
18 August 2021
Enhancement
GraphQLSearchProduct Catalog
ProductProjection Search can now be performed using the GraphQL API.
Changes:
- [GraphQL API] Added the following types to the GraphQL schema:
CategoryOrderHintProductSearch,DimensionsProductSearch,DiscountedProductSearchPriceValue,ExistsFilterInput,FacetResult,FacetResultValue,ImageProductSearch,MissingFacetInput,MissingFilterInput,PriceSelectorInput,ProductPriceSearch,ProductProjection,ProductProjectionSearchResult,ProductSearchPriceTier,ProductSearchVariant,ProductSearchVariantAvailabilitiesResult,ProductSearchVariantAvailability,ProductSearchVariantAvailabilityWithChannel,ProductSearchVariantAvailabilityWithChannels,RangeCount,RangeCountDouble,RangeCountLong,RangeElementInput,RangeFacetInput,RangeFacetResult,RangeFilterInput,RawProductSearchAttribute,SearchFacetInput,SearchFacetModelInput,SearchFilterInput,SearchFilterModelInput,SearchKeywordProductSearch,SearchKeywordsProductSearch,SuggestTokenizerProductSearch,CustomSuggestTokenizerProductSearch,WhitespaceSuggestTokenizerProductSearch,TermCount,TermsFacetInput,TermsFacetResult,TreeFacetInput,TreeFilterInput,ValueCountFacetInput,ValueFacetInput,ValueFacetResult,ValueFilterInput. - [GraphQL API] Changed the
Querytype:- Added the
productProjectionSearchfield to theQuerytype.
- Added the
The following changes were introduced in terms of GraphQL SDL:
extend type Query {productProjectionSearch(locale: Locale, text: String, facets: [SearchFacetInput!]! = [], filters: [SearchFilterInput!]! = [], queryFilters: [SearchFilterInput!]! = [], facetFilters: [SearchFilterInput!]! = [], sorts: [String!]! = [], limit: Int! = 10, offset: Int! = 0, fuzzy: Boolean! = false, fuzzyLevel: Int, priceSelector: PriceSelectorInput, markMatchingVariant: Boolean! = false,"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#beta-features"storeProjection: String,"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#beta-features"localeProjection: [Locale!], staged: Boolean = false): ProductProjectionSearchResult!}type CategoryOrderHintProductSearch {categoryId: String!orderHint: String!}type DimensionsProductSearch {width: Int!height: Int!}type DiscountedProductSearchPriceValue {value: BaseMoney!discountRef: Reference!discount: ProductDiscount}input ExistsFilterInput {path: String!}interface FacetResult {type: String!}type FacetResultValue {facet: String!value: FacetResult!}type ImageProductSearch {url: String!dimensions: DimensionsProductSearch!label: String}input MissingFacetInput {path: String!alias: String}input MissingFilterInput {path: String!}input PriceSelectorInput {currency: Currency!country: CountrycustomerGroup: ReferenceInputchannel: ReferenceInputdate: Instant!}scalar Instanttype ProductPriceSearch {id: Stringvalue: BaseMoney!country: CountrycustomerGroup: CustomerGroupcustomerGroupRef: Referencechannel: ChannelchannelRef: ReferencevalidFrom: DateTimevalidUntil: DateTimediscounted: DiscountedProductSearchPriceValuetiers: [ProductSearchPriceTier!]custom: CustomFieldsType}type ProductProjection {id: String!version: Long!createdAt: DateTime!lastModifiedAt: DateTime!productTypeRef: Reference!productType: ProductTypeDefinitionname("String is defined for different locales. This argument specifies the desired locale."locale: Locale,"List of languages the client is able to understand, and which locale variant is preferred."acceptLanguage: [Locale!]): StringnameAllLocales: [LocalizedString!]!description("String is defined for different locales. This argument specifies the desired locale."locale: Locale,"List of languages the client is able to understand, and which locale variant is preferred."acceptLanguage: [Locale!]): StringdescriptionAllLocales: [LocalizedString!]slug("String is defined for different locales. This argument specifies the desired locale."locale: Locale,"List of languages the client is able to understand, and which locale variant is preferred."acceptLanguage: [Locale!]): StringslugAllLocales: [LocalizedString!]!categoryOrderHints: [CategoryOrderHintProductSearch!]!categoriesRef: [Reference!]!categories: [Category!]!searchKeywords: [SearchKeywordsProductSearch!]!metaTitle("String is defined for different locales. This argument specifies the desired locale."locale: Locale,"List of languages the client is able to understand, and which locale variant is preferred."acceptLanguage: [Locale!]): StringmetaTitleAllLocales: [LocalizedString!]metaKeywords("String is defined for different locales. This argument specifies the desired locale."locale: Locale,"List of languages the client is able to understand, and which locale variant is preferred."acceptLanguage: [Locale!]): StringmetaKeywordsAllLocales: [LocalizedString!]metaDescription("String is defined for different locales. This argument specifies the desired locale."locale: Locale,"List of languages the client is able to understand, and which locale variant is preferred."acceptLanguage: [Locale!]): StringmetaDescriptionAllLocales: [LocalizedString!]hasStagedChanges: Boolean!published: Boolean!masterVariant: ProductSearchVariant!variants: [ProductSearchVariant!]!taxCategoryRef: ReferencetaxCategory: TaxCategorystateRef: Referencestate: StatereviewRatingStatistics: ReviewRatingStatistics}type ProductProjectionSearchResult {offset: Int!count: Int!total: Int!results: [ProductProjection!]!facets: [FacetResultValue!]!}type ProductSearchPriceTier {minimumQuantity: Int!value: BaseMoney!}type ProductSearchVariant {id: Int!key: Stringsku: Stringprices: [ProductPriceSearch!]"Returns a single price based on the price selection rules."price(currency: Currency!, country: Country, customerGroupId: String, channelId: String, date: DateTime): ProductPriceSearchimages: [ImageProductSearch!]!assets: [Asset!]!availability: ProductSearchVariantAvailabilityWithChannels"This field contains raw attributes data"attributesRaw("""The names of the attributes to include.If neither `includeNames` nor `excludeNames` are provided, then all attributes are returned."""includeNames: [String!],"""The names of the attributes to exclude.If neither `includeNames` nor `excludeNames` are provided, then all attributes are returned."""excludeNames: [String!]): [RawProductSearchAttribute!]!}"Product variant availabilities"type ProductSearchVariantAvailabilitiesResult {limit: Intoffset: Inttotal: Int!results: [ProductSearchVariantAvailabilityWithChannel!]!}"Product variant availability"type ProductSearchVariantAvailability {isOnStock: Boolean!restockableInDays: IntavailableQuantity: Long}type ProductSearchVariantAvailabilityWithChannel {channelRef: Reference!channel: Channelavailability: ProductSearchVariantAvailability!}type ProductSearchVariantAvailabilityWithChannels {noChannel: ProductSearchVariantAvailabilitychannels("""The IDs of channels to include.If neither `includeChannelIds` nor `excludeChannelIds` are provided, then all channels are returned."""includeChannelIds: [String!],"""The IDs of channels to exclude.If neither `includeChannelIds` nor `excludeChannelIds` are provided, then all channels are returned."""excludeChannelIds: [String!], limit: Int, offset: Int): ProductSearchVariantAvailabilitiesResult!}interface RangeCount {type: String!}type RangeCountDouble implements RangeCount {from: Float!fromStr: String!to: Float!toStr: String!count: Int!productCount: InttotalCount: Int!total: Float!min: Float!max: Float!mean: Float!type: String!}type RangeCountLong implements RangeCount {from: Long!fromStr: String!to: Long!toStr: String!count: Int!productCount: InttotalCount: Int!total: Long!min: Long!max: Long!mean: Float!type: String!}input RangeElementInput {from: String!to: String!}input RangeFacetInput {path: String!ranges: [RangeElementInput!]!alias: StringcountProducts: Boolean! = false}type RangeFacetResult implements FacetResult {dataType: String!ranges: [RangeCount!]!type: String!}input RangeFilterInput {path: String!ranges: [RangeElementInput!]!}type RawProductSearchAttribute {name: String!value: Json!}input SearchFacetInput {"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#beta-features"model: SearchFacetModelInputstring: String}input SearchFacetModelInput {terms: TermsFacetInputvalue: ValueFacetInputrange: RangeFacetInputtree: TreeFacetInputvalueCount: ValueCountFacetInputmissing: MissingFacetInput}input SearchFilterInput {"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#beta-features"model: SearchFilterModelInputstring: String}input SearchFilterModelInput {value: ValueFilterInputrange: RangeFilterInputmissing: MissingFilterInputexists: ExistsFilterInputtree: TreeFilterInput}type SearchKeywordProductSearch {text: String!suggestTokenizer: SuggestTokenizerProductSearch}type SearchKeywordsProductSearch {locale: Locale!searchKeywords: [SearchKeywordProductSearch!]!}interface SuggestTokenizerProductSearch {type: String!}type CustomSuggestTokenizerProductSearch implements SuggestTokenizerProductSearch {inputs: [String!]!type: String!}type WhitespaceSuggestTokenizerProductSearch implements SuggestTokenizerProductSearch {type: String!}type TermCount {term: String!count: Int!productCount: Int}input TermsFacetInput {path: String!alias: StringcountProducts: Boolean! = false}type TermsFacetResult implements FacetResult {dataType: String!missing: Int!total: Int!other: Int!terms: [TermCount!]!type: String!}input TreeFacetInput {path: String!rootValues: [String!]!subTreeValues: [String!]!alias: StringcountProducts: Boolean! = false}input TreeFilterInput {path: String!rootValues: [String!]!subTreeValues: [String!]!}input ValueCountFacetInput {path: String!alias: String}input ValueFacetInput {path: String!values: [String!]!alias: StringcountProducts: Boolean! = false}type ValueFacetResult implements FacetResult {count: Int!productCount: Inttype: String!}input ValueFilterInput {path: String!values: [String!]!}