diff --git a/composer.json b/composer.json index 832727e..6911087 100644 --- a/composer.json +++ b/composer.json @@ -13,10 +13,9 @@ "require": { "php": "^7.1", "sylius/sylius": "^1.0", - "ongr/elasticsearch-dsl": "^5.0", - "ongr/elasticsearch-bundle": "^5.0", + "ongr/elasticsearch-bundle": "dev-6.0-dev", "simple-bus/symfony-bridge": "^4.1", - "ongr/filter-manager-bundle": "2.1.x-dev as v2.1.1", + "ongr/filter-manager-bundle": "dev-es-6.0", "ramsey/uuid": "^3.7" }, "require-dev": { diff --git a/src/Command/UpdateProductIndexCommand.php b/src/Command/UpdateProductIndexCommand.php index 05308be..f16142f 100644 --- a/src/Command/UpdateProductIndexCommand.php +++ b/src/Command/UpdateProductIndexCommand.php @@ -12,7 +12,7 @@ use Sylius\Component\Core\Model\ProductInterface; use Sylius\Component\Core\Repository\ProductRepositoryInterface; use Sylius\Component\Locale\Model\LocaleInterface; -use Sylius\ElasticSearchPlugin\Document\ProductDocument; +use Sylius\ElasticSearchPlugin\Document\ProductDocumentInterface; use Sylius\ElasticSearchPlugin\Factory\Document\ProductDocumentFactoryInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -42,18 +42,20 @@ final class UpdateProductIndexCommand extends Command private $productDocumentFactory; /** - * @param ProductRepositoryInterface $productRepository - * @param Manager $elasticsearchManager + * @param ProductRepositoryInterface $productRepository + * @param Manager $elasticsearchManager * @param ProductDocumentFactoryInterface $productDocumentFactory + * @param string $productDocumentClass */ public function __construct( ProductRepositoryInterface $productRepository, Manager $elasticsearchManager, - ProductDocumentFactoryInterface $productDocumentFactory + ProductDocumentFactoryInterface $productDocumentFactory, + string $productDocumentClass ) { $this->productRepository = $productRepository; $this->elasticsearchManager = $elasticsearchManager; - $this->productDocumentRepository = $elasticsearchManager->getRepository(ProductDocument::class); + $this->productDocumentRepository = $elasticsearchManager->getRepository($productDocumentClass); $this->productDocumentFactory = $productDocumentFactory; parent::__construct('sylius:elastic-search:update-product-index'); @@ -81,7 +83,7 @@ protected function execute(InputInterface $input, OutputInterface $output): void $search->setScroll('10m'); $search->addSort(new FieldSort('synchronised_at', 'asc')); - /** @var DocumentIterator|ProductDocument[] $productDocuments */ + /** @var DocumentIterator|ProductDocumentInterface[] $productDocuments */ $productDocuments = $this->productDocumentRepository->findDocuments($search); foreach ($productDocuments as $productDocument) { @@ -143,7 +145,7 @@ private function scheduleCreatingNewProductDocuments(string $productCode): void private function scheduleRemovingOldProductDocuments(string $productCode): void { - /** @var DocumentIterator|ProductDocument[] $currentProductDocuments */ + /** @var DocumentIterator|ProductDocumentInterface[] $currentProductDocuments */ $currentProductDocuments = $this->productDocumentRepository->findBy(['code' => $productCode]); foreach ($currentProductDocuments as $sameCodeProductDocument) { diff --git a/src/Document/AttributeDocument.php b/src/Document/AttributeDocument.php index f875f3f..95d5d1d 100644 --- a/src/Document/AttributeDocument.php +++ b/src/Document/AttributeDocument.php @@ -7,9 +7,9 @@ use ONGR\ElasticsearchBundle\Annotation as ElasticSearch; /** - * @ElasticSearch\Nested + * @ElasticSearch\NestedType */ -class AttributeDocument +class AttributeDocument implements AttributeDocumentInterface { /** * @var string diff --git a/src/Document/AttributeDocumentInterface.php b/src/Document/AttributeDocumentInterface.php new file mode 100644 index 0000000..b881f13 --- /dev/null +++ b/src/Document/AttributeDocumentInterface.php @@ -0,0 +1,38 @@ +amount = $amount; } diff --git a/src/Document/PriceDocumentInterface.php b/src/Document/PriceDocumentInterface.php new file mode 100644 index 0000000..160cb35 --- /dev/null +++ b/src/Document/PriceDocumentInterface.php @@ -0,0 +1,38 @@ +attributes = new Collection(); - $this->taxons = new Collection(); - $this->images = new Collection(); - $this->variants = new Collection(); + $this->attributes = new ArrayCollection(); + $this->taxons = new ArrayCollection(); + $this->images = new ArrayCollection(); + $this->variants = new ArrayCollection(); } /** @@ -300,39 +301,39 @@ public function setDescription(?string $description): void } /** - * @return PriceDocument + * @return PriceDocumentInterface */ - public function getPrice(): PriceDocument + public function getPrice(): PriceDocumentInterface { return $this->price; } /** - * @param PriceDocument $price + * @param PriceDocumentInterface $price */ - public function setPrice(PriceDocument $price): void + public function setPrice(PriceDocumentInterface $price): void { $this->price = $price; } /** - * @return TaxonDocument + * @return TaxonDocumentInterface */ - public function getMainTaxon(): ?TaxonDocument + public function getMainTaxon(): ?TaxonDocumentInterface { return $this->mainTaxon; } /** - * @param TaxonDocument $mainTaxon + * @param TaxonDocumentInterface $mainTaxon */ - public function setMainTaxon(TaxonDocument $mainTaxon): void + public function setMainTaxon(TaxonDocumentInterface $mainTaxon): void { $this->mainTaxon = $mainTaxon; } /** - * @return Collection|TaxonDocument[] + * @return Collection|TaxonDocumentInterface[] */ public function getTaxons(): Collection { @@ -340,15 +341,15 @@ public function getTaxons(): Collection } /** - * @param Collection|TaxonDocument[] $taxons + * @param Collection|TaxonDocumentInterface[] $taxons */ - public function setTaxons($taxons): void + public function setTaxons(Collection $taxons): void { $this->taxons = $taxons; } /** - * @return Collection + * @return Collection|AttributeDocumentInterface[] */ public function getAttributes(): Collection { @@ -364,7 +365,7 @@ public function setAttributes(Collection $attributes): void } /** - * @return Collection + * @return Collection|ImageDocumentInterface[] */ public function getImages(): Collection { @@ -428,7 +429,7 @@ public function setSynchronisedAt(\DateTimeInterface $synchronisedAt): void } /** - * @return Collection + * @return Collection|VariantDocumentInterface[] */ public function getVariants(): Collection { diff --git a/src/Document/ProductDocumentInterface.php b/src/Document/ProductDocumentInterface.php new file mode 100644 index 0000000..5b9a44a --- /dev/null +++ b/src/Document/ProductDocumentInterface.php @@ -0,0 +1,190 @@ +images = new Collection(); + $this->images = new ArrayCollection(); } /** diff --git a/src/Document/TaxonDocumentInterface.php b/src/Document/TaxonDocumentInterface.php new file mode 100644 index 0000000..7c8c73f --- /dev/null +++ b/src/Document/TaxonDocumentInterface.php @@ -0,0 +1,60 @@ +images = new Collection(); - $this->options = new Collection(); + $this->images = new ArrayCollection(); + $this->options = new ArrayCollection(); } /** @@ -107,17 +108,17 @@ public function setImages(Collection $images): void } /** - * @return PriceDocument + * @return PriceDocumentInterface */ - public function getPrice(): PriceDocument + public function getPrice(): PriceDocumentInterface { return $this->price; } /** - * @param PriceDocument $price + * @param PriceDocumentInterface $price */ - public function setPrice(PriceDocument $price): void + public function setPrice(PriceDocumentInterface $price): void { $this->price = $price; } @@ -192,7 +193,7 @@ public function setIsTracked(bool $isTracked): void } /** - * @return Collection + * @return Collection|OptionDocument[] */ public function getOptions(): Collection { diff --git a/src/Document/VariantDocumentInterface.php b/src/Document/VariantDocumentInterface.php new file mode 100644 index 0000000..2ce08a0 --- /dev/null +++ b/src/Document/VariantDocumentInterface.php @@ -0,0 +1,95 @@ +attributeDocumentClass(); $productAttribute->setCode($productAttributeValue->getCode()); $productAttribute->setValue($data); diff --git a/src/Factory/Document/ImageDocumentFactory.php b/src/Factory/Document/ImageDocumentFactory.php index e352f7f..783c611 100644 --- a/src/Factory/Document/ImageDocumentFactory.php +++ b/src/Factory/Document/ImageDocumentFactory.php @@ -5,7 +5,7 @@ namespace Sylius\ElasticSearchPlugin\Factory\Document; use Sylius\Component\Core\Model\ImageInterface; -use Sylius\ElasticSearchPlugin\Document\ImageDocument; +use Sylius\ElasticSearchPlugin\Document\ImageDocumentInterface; final class ImageDocumentFactory implements ImageDocumentFactoryInterface { @@ -17,9 +17,9 @@ public function __construct(string $imageDocumentClass) $this->imageDocumentClass = $imageDocumentClass; } - public function create(ImageInterface $image): ImageDocument + public function create(ImageInterface $image): ImageDocumentInterface { - /** @var ImageDocument $imageDocument */ + /** @var ImageDocumentInterface $imageDocument */ $imageDocument = new $this->imageDocumentClass(); $imageDocument->setCode($image->getType()); $imageDocument->setPath($image->getPath()); diff --git a/src/Factory/Document/ImageDocumentFactoryInterface.php b/src/Factory/Document/ImageDocumentFactoryInterface.php index dd0c165..938222f 100644 --- a/src/Factory/Document/ImageDocumentFactoryInterface.php +++ b/src/Factory/Document/ImageDocumentFactoryInterface.php @@ -5,9 +5,9 @@ namespace Sylius\ElasticSearchPlugin\Factory\Document; use Sylius\Component\Core\Model\ImageInterface; -use Sylius\ElasticSearchPlugin\Document\ImageDocument; +use Sylius\ElasticSearchPlugin\Document\ImageDocumentInterface; interface ImageDocumentFactoryInterface { - public function create(ImageInterface $image): ImageDocument; + public function create(ImageInterface $image): ImageDocumentInterface; } diff --git a/src/Factory/Document/OptionDocumentFactory.php b/src/Factory/Document/OptionDocumentFactory.php index 508d756..3a815aa 100644 --- a/src/Factory/Document/OptionDocumentFactory.php +++ b/src/Factory/Document/OptionDocumentFactory.php @@ -8,7 +8,7 @@ use Sylius\Component\Product\Model\ProductOptionTranslationInterface; use Sylius\Component\Product\Model\ProductOptionValueInterface; use Sylius\Component\Product\Model\ProductOptionValueTranslationInterface; -use Sylius\ElasticSearchPlugin\Document\OptionDocument; +use Sylius\ElasticSearchPlugin\Document\OptionDocumentInterface; final class OptionDocumentFactory implements OptionDocumentFactoryInterface { @@ -23,14 +23,14 @@ public function __construct(string $optionDocumentClass) public function create( ProductOptionValueInterface $optionValue, LocaleInterface $locale - ): OptionDocument { + ): OptionDocumentInterface { /** @var ProductOptionValueTranslationInterface $optionValueTranslation */ $optionValueTranslation = $optionValue->getTranslation($locale->getCode()); /** @var ProductOptionTranslationInterface $productOptionTranslation */ $productOptionTranslation = $optionValue->getOption()->getTranslation($locale->getCode()); - /** @var OptionDocument $option */ + /** @var OptionDocumentInterface $option */ $option = new $this->optionDocumentClass(); $option->setCode($optionValue->getOptionCode()); $option->setName($productOptionTranslation->getName()); diff --git a/src/Factory/Document/OptionDocumentFactoryInterface.php b/src/Factory/Document/OptionDocumentFactoryInterface.php index bb94f44..4b2a761 100644 --- a/src/Factory/Document/OptionDocumentFactoryInterface.php +++ b/src/Factory/Document/OptionDocumentFactoryInterface.php @@ -6,12 +6,12 @@ use Sylius\Component\Locale\Model\LocaleInterface; use Sylius\Component\Product\Model\ProductOptionValueInterface; -use Sylius\ElasticSearchPlugin\Document\OptionDocument; +use Sylius\ElasticSearchPlugin\Document\OptionDocumentInterface; interface OptionDocumentFactoryInterface { public function create( ProductOptionValueInterface $optionValue, LocaleInterface $locale - ): OptionDocument; + ): OptionDocumentInterface; } diff --git a/src/Factory/Document/PriceDocumentFactory.php b/src/Factory/Document/PriceDocumentFactory.php index f8e1e75..9152f52 100644 --- a/src/Factory/Document/PriceDocumentFactory.php +++ b/src/Factory/Document/PriceDocumentFactory.php @@ -6,7 +6,7 @@ use Sylius\Component\Core\Model\ChannelPricingInterface; use Sylius\Component\Currency\Model\CurrencyInterface; -use Sylius\ElasticSearchPlugin\Document\PriceDocument; +use Sylius\ElasticSearchPlugin\Document\PriceDocumentInterface; final class PriceDocumentFactory implements PriceDocumentFactoryInterface { @@ -23,8 +23,8 @@ public function __construct(string $priceDocumentClass) public function create( ChannelPricingInterface $channelPricing, CurrencyInterface $currency - ): PriceDocument { - /** @var PriceDocument $price */ + ): PriceDocumentInterface { + /** @var PriceDocumentInterface $price */ $price = new $this->priceDocumentClass(); $originalAmount = $channelPricing->getOriginalPrice(); diff --git a/src/Factory/Document/PriceDocumentFactoryInterface.php b/src/Factory/Document/PriceDocumentFactoryInterface.php index a9afd30..e2e5630 100644 --- a/src/Factory/Document/PriceDocumentFactoryInterface.php +++ b/src/Factory/Document/PriceDocumentFactoryInterface.php @@ -6,12 +6,12 @@ use Sylius\Component\Core\Model\ChannelPricingInterface; use Sylius\Component\Currency\Model\CurrencyInterface; -use Sylius\ElasticSearchPlugin\Document\PriceDocument; +use Sylius\ElasticSearchPlugin\Document\PriceDocumentInterface; interface PriceDocumentFactoryInterface { public function create( ChannelPricingInterface $channelPricing, CurrencyInterface $currency - ): PriceDocument; + ): PriceDocumentInterface; } diff --git a/src/Factory/Document/ProductDocumentFactory.php b/src/Factory/Document/ProductDocumentFactory.php index 1de2e0d..3add393 100644 --- a/src/Factory/Document/ProductDocumentFactory.php +++ b/src/Factory/Document/ProductDocumentFactory.php @@ -4,8 +4,8 @@ namespace Sylius\ElasticSearchPlugin\Factory\Document; -use Doctrine\Common\Collections\Collection as DoctrineCollection; -use ONGR\ElasticsearchBundle\Collection\Collection; +use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\ArrayCollection; use Ramsey\Uuid\Uuid; use Sylius\Component\Core\Model\ChannelInterface; use Sylius\Component\Core\Model\ChannelPricingInterface; @@ -14,9 +14,9 @@ use Sylius\Component\Core\Model\ProductVariantInterface; use Sylius\Component\Locale\Model\LocaleInterface; use Sylius\Component\Resource\Model\TranslationInterface; -use Sylius\ElasticSearchPlugin\Document\ImageDocument; -use Sylius\ElasticSearchPlugin\Document\ProductDocument; -use Sylius\ElasticSearchPlugin\Document\TaxonDocument; +use Sylius\ElasticSearchPlugin\Document\ImageDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\ProductDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\TaxonDocumentInterface; use Zend\Stdlib\ArrayObject; final class ProductDocumentFactory implements ProductDocumentFactoryInterface @@ -60,7 +60,7 @@ public function __construct( VariantDocumentFactoryInterface $variantDocumentFactory, array $attributeWhitelist ) { - $this->assertClassExtends($productDocumentClass, ProductDocument::class); + $this->assertClassImplements($productDocumentClass, ProductDocumentInterface::class); $this->productDocumentClass = $productDocumentClass; $this->attributeDocumentFactory = $attributeDocumentFactory; @@ -78,13 +78,13 @@ public function __construct( * @param LocaleInterface $locale * @param ChannelInterface $channel * - * @return ProductDocument + * @return ProductDocumentInterface */ public function create( ProductInterface $product, LocaleInterface $locale, ChannelInterface $channel - ): ProductDocument { + ): ProductDocumentInterface { /** @var ProductVariantInterface[] $productVariants */ $productVariants = $product->getVariants()->filter(function (ProductVariantInterface $productVariant) use ($channel): bool { return $productVariant->hasChannelPricingForChannel($channel); @@ -104,7 +104,7 @@ function (ProductVariantInterface $a, ProductVariantInterface $b) { $variantDocuments[] = $this->variantDocumentFactory->create($variant, $channel, $locale); } - /** @var ImageDocument[] $imageDocuments */ + /** @var ImageDocumentInterface[] $imageDocuments */ $imageDocuments = []; foreach ($product->getImages() as $productImage) { foreach ($productVariants as $variant) { @@ -116,7 +116,7 @@ function (ProductVariantInterface $a, ProductVariantInterface $b) { $imageDocuments[] = $this->imageDocumentFactory->create($productImage); } - /** @var TaxonDocument[] $taxonDocuments */ + /** @var TaxonDocumentInterface[] $taxonDocuments */ $taxonDocuments = []; foreach ($product->getProductTaxons() as $syliusProductTaxon) { $taxonDocuments[] = $this->taxonDocumentFactory->create( @@ -131,7 +131,7 @@ function (ProductVariantInterface $a, ProductVariantInterface $b) { $attributeDocuments = $this->getAttributeDocuments($product, $locale, $channel); - /** @var ProductDocument $productDocument */ + /** @var ProductDocumentInterface $productDocument */ $productDocument = new $this->productDocumentClass(); $productDocument->setUuid(Uuid::uuid4()->toString()); $productDocument->setId($product->getId()); @@ -145,10 +145,10 @@ function (ProductVariantInterface $a, ProductVariantInterface $b) { $productDocument->setCreatedAt($product->getCreatedAt()); $productDocument->setSynchronisedAt(new \DateTime('now')); $productDocument->setAverageReviewRating($product->getAverageRating()); - $productDocument->setVariants(new Collection($variantDocuments)); - $productDocument->setImages(new Collection($imageDocuments)); - $productDocument->setTaxons(new Collection($taxonDocuments)); - $productDocument->setAttributes(new Collection($attributeDocuments)); + $productDocument->setVariants(new ArrayCollection($variantDocuments)); + $productDocument->setImages(new ArrayCollection($imageDocuments)); + $productDocument->setTaxons(new ArrayCollection($taxonDocuments)); + $productDocument->setAttributes(new ArrayCollection($attributeDocuments)); /** * Set smallest product variant price, used for search by price @@ -170,7 +170,7 @@ function (ProductVariantInterface $a, ProductVariantInterface $b) { } /** - * @param ProductVariantInterface[]|DoctrineCollection $variants + * @param ProductVariantInterface[]|Collection $variants * @param ChannelInterface $channel * * @return ChannelPricingInterface @@ -200,10 +200,10 @@ private function getMinimalPriceFromVariants($variants, ChannelInterface $channe * * @throws \InvalidArgumentException */ - private function assertClassExtends(string $class, string $parentClass) + private function assertClassImplements(string $class, string $parentClass) { - if ($class !== $parentClass && !in_array($parentClass, class_parents($class), true)) { - throw new \InvalidArgumentException(sprintf('Class %s MUST extend class %s!', $class, $parentClass)); + if ($class instanceof $parentClass) { + throw new \InvalidArgumentException(sprintf('Class %s MUST implement class %s!', $class, $parentClass)); } } diff --git a/src/Factory/Document/ProductDocumentFactoryInterface.php b/src/Factory/Document/ProductDocumentFactoryInterface.php index dd0dce5..d93da8e 100644 --- a/src/Factory/Document/ProductDocumentFactoryInterface.php +++ b/src/Factory/Document/ProductDocumentFactoryInterface.php @@ -7,7 +7,7 @@ use Sylius\Component\Core\Model\ChannelInterface; use Sylius\Component\Core\Model\ProductInterface; use Sylius\Component\Locale\Model\LocaleInterface; -use Sylius\ElasticSearchPlugin\Document\ProductDocument; +use Sylius\ElasticSearchPlugin\Document\ProductDocumentInterface; interface ProductDocumentFactoryInterface { @@ -16,11 +16,11 @@ interface ProductDocumentFactoryInterface * @param LocaleInterface $locale * @param ChannelInterface $channel * - * @return ProductDocument + * @return ProductDocumentInterface */ public function create( ProductInterface $product, LocaleInterface $locale, ChannelInterface $channel - ): ProductDocument; + ): ProductDocumentInterface; } diff --git a/src/Factory/Document/TaxonDocumentFactory.php b/src/Factory/Document/TaxonDocumentFactory.php index 01c1f82..657f3cb 100644 --- a/src/Factory/Document/TaxonDocumentFactory.php +++ b/src/Factory/Document/TaxonDocumentFactory.php @@ -4,12 +4,12 @@ namespace Sylius\ElasticSearchPlugin\Factory\Document; -use ONGR\ElasticsearchBundle\Collection\Collection; +use Doctrine\Common\Collections\ArrayCollection; use Sylius\Component\Core\Model\TaxonInterface; use Sylius\Component\Locale\Model\LocaleInterface; use Sylius\Component\Taxonomy\Model\TaxonTranslationInterface; -use Sylius\ElasticSearchPlugin\Document\ImageDocument; -use Sylius\ElasticSearchPlugin\Document\TaxonDocument; +use Sylius\ElasticSearchPlugin\Document\ImageDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\TaxonDocumentInterface; final class TaxonDocumentFactory implements TaxonDocumentFactoryInterface { @@ -30,14 +30,14 @@ public function __construct(string $taxonDocumentClass, ImageDocumentFactoryInte * @param LocaleInterface $localeCode * @param int|null $position Override the position in the Taxon model by passing your own * - * @return TaxonDocument + * @return TaxonDocumentInterface */ - public function create(TaxonInterface $taxon, LocaleInterface $localeCode, ?int $position = null): TaxonDocument + public function create(TaxonInterface $taxon, LocaleInterface $localeCode, ?int $position = null): TaxonDocumentInterface { /** @var TaxonTranslationInterface $taxonTranslation */ $taxonTranslation = $taxon->getTranslation($localeCode->getCode()); - /** @var TaxonDocument $taxonDocument */ + /** @var TaxonDocumentInterface $taxonDocument */ $taxonDocument = new $this->taxonDocumentClass(); $taxonDocument->setCode($taxon->getCode()); $taxonDocument->setSlug($taxonTranslation->getSlug()); @@ -49,12 +49,12 @@ public function create(TaxonInterface $taxon, LocaleInterface $localeCode, ?int $taxonDocument->setDescription($taxonTranslation->getDescription()); - /** @var ImageDocument[] $images */ + /** @var ImageDocumentInterface[] $images */ $images = []; foreach ($taxon->getImages() as $image) { $images[] = $this->imageDocumentFactory->create($image); } - $taxonDocument->setImages(new Collection($images)); + $taxonDocument->setImages(new ArrayCollection($images)); return $taxonDocument; } diff --git a/src/Factory/Document/TaxonDocumentFactoryInterface.php b/src/Factory/Document/TaxonDocumentFactoryInterface.php index 6227b79..30e52ce 100644 --- a/src/Factory/Document/TaxonDocumentFactoryInterface.php +++ b/src/Factory/Document/TaxonDocumentFactoryInterface.php @@ -7,8 +7,9 @@ use Sylius\Component\Core\Model\TaxonInterface; use Sylius\Component\Locale\Model\LocaleInterface; use Sylius\ElasticSearchPlugin\Document\TaxonDocument; +use Sylius\ElasticSearchPlugin\Document\TaxonDocumentInterface; interface TaxonDocumentFactoryInterface { - public function create(TaxonInterface $taxon, LocaleInterface $localeCode, ?int $position = null): TaxonDocument; + public function create(TaxonInterface $taxon, LocaleInterface $localeCode, ?int $position = null): TaxonDocumentInterface; } diff --git a/src/Factory/Document/VariantDocumentFactory.php b/src/Factory/Document/VariantDocumentFactory.php index a897d86..970868f 100644 --- a/src/Factory/Document/VariantDocumentFactory.php +++ b/src/Factory/Document/VariantDocumentFactory.php @@ -4,14 +4,14 @@ namespace Sylius\ElasticSearchPlugin\Factory\Document; -use ONGR\ElasticsearchBundle\Collection\Collection; +use Doctrine\Common\Collections\ArrayCollection; use Sylius\Component\Core\Model\ChannelInterface; use Sylius\Component\Core\Model\ChannelPricingInterface; use Sylius\Component\Core\Model\ProductVariantInterface; use Sylius\Component\Locale\Model\LocaleInterface; use Sylius\Component\Product\Model\ProductVariantTranslationInterface; -use Sylius\ElasticSearchPlugin\Document\ImageDocument; -use Sylius\ElasticSearchPlugin\Document\VariantDocument; +use Sylius\ElasticSearchPlugin\Document\ImageDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\VariantDocumentInterface; final class VariantDocumentFactory implements VariantDocumentFactoryInterface { @@ -43,7 +43,7 @@ public function create( ProductVariantInterface $productVariant, ChannelInterface $channel, LocaleInterface $locale - ): VariantDocument { + ): VariantDocumentInterface { $options = []; foreach ($productVariant->getOptionValues() as $optionValue) { $options[] = $this->optionDocumentFactory->create($optionValue, $locale); @@ -60,7 +60,7 @@ public function create( /** @var ProductVariantTranslationInterface $productVariantTranslation */ $productVariantTranslation = $productVariant->getTranslation($locale->getCode()); - /** @var VariantDocument $variant */ + /** @var VariantDocumentInterface $variant */ $variant = new $this->variantDocumentClass(); $variant->setId($productVariant->getId()); $variant->setCode($productVariant->getCode()); @@ -74,14 +74,14 @@ public function create( $variant->setPrice($price); $variant->setStock($productVariant->getOnHand() - $productVariant->getOnHold()); $variant->setIsTracked($productVariant->isTracked()); - $variant->setOptions(new Collection($options)); + $variant->setOptions(new ArrayCollection($options)); if ($productVariant->getImages()->count() > 0) { - /** @var ImageDocument[] $images */ + /** @var ImageDocumentInterface[] $images */ $images = []; foreach ($productVariant->getImages() as $image) { $images[] = $this->imageDocumentFactory->create($image); } - $variant->setImages(new Collection($images)); + $variant->setImages(new ArrayCollection($images)); } return $variant; diff --git a/src/Factory/Document/VariantDocumentFactoryInterface.php b/src/Factory/Document/VariantDocumentFactoryInterface.php index c3254f2..079f2bd 100644 --- a/src/Factory/Document/VariantDocumentFactoryInterface.php +++ b/src/Factory/Document/VariantDocumentFactoryInterface.php @@ -7,7 +7,7 @@ use Sylius\Component\Core\Model\ChannelInterface; use Sylius\Component\Core\Model\ProductVariantInterface; use Sylius\Component\Locale\Model\LocaleInterface; -use Sylius\ElasticSearchPlugin\Document\VariantDocument; +use Sylius\ElasticSearchPlugin\Document\VariantDocumentInterface; interface VariantDocumentFactoryInterface { @@ -15,5 +15,5 @@ public function create( ProductVariantInterface $productVariant, ChannelInterface $channel, LocaleInterface $locale - ): VariantDocument; + ): VariantDocumentInterface; } diff --git a/src/Factory/View/ProductListViewFactory.php b/src/Factory/View/ProductListViewFactory.php index 487f2cc..c249cd7 100644 --- a/src/Factory/View/ProductListViewFactory.php +++ b/src/Factory/View/ProductListViewFactory.php @@ -4,7 +4,7 @@ namespace Sylius\ElasticSearchPlugin\Factory\View; -use ONGR\ElasticsearchBundle\Collection\Collection; +use Doctrine\Common\Collections\Collection; use ONGR\FilterManagerBundle\Search\SearchResponse; use Sylius\ElasticSearchPlugin\Controller\AttributeView; use Sylius\ElasticSearchPlugin\Controller\ImageView; @@ -14,11 +14,11 @@ use Sylius\ElasticSearchPlugin\Controller\TaxonView; use Sylius\ElasticSearchPlugin\Controller\VariantView; use Sylius\ElasticSearchPlugin\Document\AttributeDocument; -use Sylius\ElasticSearchPlugin\Document\ImageDocument; -use Sylius\ElasticSearchPlugin\Document\PriceDocument; -use Sylius\ElasticSearchPlugin\Document\ProductDocument; -use Sylius\ElasticSearchPlugin\Document\TaxonDocument; -use Sylius\ElasticSearchPlugin\Document\VariantDocument; +use Sylius\ElasticSearchPlugin\Document\ImageDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\PriceDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\ProductDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\TaxonDocumentInterface; +use Sylius\ElasticSearchPlugin\Document\VariantDocumentInterface; final class ProductListViewFactory implements ProductListViewFactoryInterface { @@ -79,7 +79,7 @@ public function createFromSearchResponse(SearchResponse $response): ProductListV $productListView->pages = $pager['num_pages']; $productListView->limit = $pager['limit']; - /** @var ProductDocument $product */ + /** @var ProductDocumentInterface $product */ foreach ($result as $product) { $productListView->items[] = $this->getProductView($product); } @@ -88,7 +88,7 @@ public function createFromSearchResponse(SearchResponse $response): ProductListV } /** - * @param Collection|ImageDocument[] $images + * @param Collection|ImageDocumentInterface[] $images * * @return ImageView[] */ @@ -108,12 +108,12 @@ private function getImageViews(Collection $images): array } /** - * @param Collection|TaxonDocument[] $taxons - * @param TaxonDocument|null $mainTaxonDocument + * @param Collection|TaxonDocumentInterface[] $taxons + * @param TaxonDocumentInterface|null $mainTaxonDocument * * @return TaxonView */ - private function getTaxonView(Collection $taxons, ?TaxonDocument $mainTaxonDocument): TaxonView + private function getTaxonView(Collection $taxons, ?TaxonDocumentInterface $mainTaxonDocument): TaxonView { /** @var TaxonView $taxonView */ $taxonView = new $this->taxonViewClass(); @@ -148,11 +148,11 @@ private function getAttributeViews(Collection $attributes): array } /** - * @param PriceDocument $price + * @param PriceDocumentInterface $price * * @return PriceView */ - private function getPriceView(PriceDocument $price): PriceView + private function getPriceView(PriceDocumentInterface $price): PriceView { /** @var PriceView $priceView */ $priceView = new $this->priceViewClass(); @@ -164,7 +164,7 @@ private function getPriceView(PriceDocument $price): PriceView } /** - * @param VariantDocument[]|Collection $variants + * @param VariantDocumentInterface[]|Collection $variants * * @return array */ @@ -191,11 +191,11 @@ private function getVariantViews(Collection $variants): array } /** - * @param ProductDocument $product + * @param ProductDocumentInterface $product * * @return ProductView */ - private function getProductView(ProductDocument $product): ProductView + private function getProductView(ProductDocumentInterface $product): ProductView { /** @var ProductView $productView */ $productView = new $this->productViewClass(); diff --git a/src/Projection/ProductProjector.php b/src/Projection/ProductProjector.php index 4f70578..07c1700 100644 --- a/src/Projection/ProductProjector.php +++ b/src/Projection/ProductProjector.php @@ -10,7 +10,7 @@ use Sylius\Component\Core\Model\ChannelInterface; use Sylius\Component\Core\Model\ProductInterface; use Sylius\Component\Locale\Model\LocaleInterface; -use Sylius\ElasticSearchPlugin\Document\ProductDocument; +use Sylius\ElasticSearchPlugin\Document\ProductDocumentInterface; use Sylius\ElasticSearchPlugin\Event\ProductCreated; use Sylius\ElasticSearchPlugin\Event\ProductDeleted; use Sylius\ElasticSearchPlugin\Event\ProductUpdated; @@ -36,13 +36,15 @@ final class ProductProjector /** * @param Manager $elasticsearchManager * @param ProductDocumentFactoryInterface $productDocumentFactory + * @param string $productDocumentClass */ public function __construct( Manager $elasticsearchManager, - ProductDocumentFactoryInterface $productDocumentFactory + ProductDocumentFactoryInterface $productDocumentFactory, + string $productDocumentClass ) { $this->elasticsearchManager = $elasticsearchManager; - $this->productDocumentRepository = $elasticsearchManager->getRepository(ProductDocument::class); + $this->productDocumentRepository = $elasticsearchManager->getRepository($productDocumentClass); $this->productDocumentFactory = $productDocumentFactory; } @@ -107,7 +109,7 @@ private function scheduleCreatingNewProductDocuments(ProductInterface $product): private function scheduleRemovingOldProductDocuments(ProductInterface $product): void { - /** @var DocumentIterator|ProductDocument[] $currentProductDocuments */ + /** @var DocumentIterator|ProductDocumentInterface[] $currentProductDocuments */ $currentProductDocuments = $this->productDocumentRepository->findBy(['code' => $product->getCode()]); foreach ($currentProductDocuments as $sameCodeProductDocument) { diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index ec4ce9a..d4919b1 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -18,6 +18,7 @@ + %sylius_elastic_search.document.product.class% diff --git a/src/Resources/config/services/command.xml b/src/Resources/config/services/command.xml index fcbe262..7e5e4fd 100644 --- a/src/Resources/config/services/command.xml +++ b/src/Resources/config/services/command.xml @@ -13,6 +13,7 @@ + %sylius_elastic_search.document.product.class% diff --git a/tests/Factory/ProductDocumentFactoryTest.php b/tests/Factory/ProductDocumentFactoryTest.php index 28c93fa..02610df 100644 --- a/tests/Factory/ProductDocumentFactoryTest.php +++ b/tests/Factory/ProductDocumentFactoryTest.php @@ -4,7 +4,7 @@ namespace Tests\Sylius\ElasticSearchPlugin\Factory; -use ONGR\ElasticsearchBundle\Collection\Collection; +use Doctrine\Common\Collections\ArrayCollection; use Sylius\Bundle\ChannelBundle\Doctrine\ORM\ChannelRepository; use Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductRepository; use Sylius\Component\Core\Model\Channel; @@ -106,7 +106,7 @@ public function it_creates_product_document_from_sylius_product_model() $this->assertEquals($product->getCode(), $product->getCode()); $this->assertEquals($product->getName(), $product->getName()); $this->assertEquals('en_GB', $product->getLocaleCode()); - $this->assertEquals(new Collection($productAttributes), $product->getAttributes()); + $this->assertEquals(new ArrayCollection($productAttributes), $product->getAttributes()); $this->assertEquals(1000, $product->getPrice()->getAmount()); $this->assertEquals('GBP', $product->getPrice()->getCurrency()); $this->assertEquals('en_GB', $product->getLocaleCode()); @@ -115,8 +115,8 @@ public function it_creates_product_document_from_sylius_product_model() $this->assertEquals('Logan Mug', $product->getName()); $this->assertEquals($createdAt, $product->getCreatedAt()); $this->assertEquals('Logan Mug', $product->getDescription()); - $this->assertEquals($taxon, $product->getMainTaxon()); - $this->assertEquals(new Collection($productTaxons), $product->getTaxons()); + $this->assertEquals($taxon->getCode(), $product->getMainTaxon()->getCode()); + $this->assertEquals(new ArrayCollection($productTaxons), $product->getTaxons()); $this->assertEquals(0.0, $product->getAverageReviewRating()); } @@ -170,7 +170,7 @@ public function it_creates_product_document_only_with_whitelisted_attributes() $this->assertEquals($product->getName(), $product->getName()); $this->assertEquals('en_GB', $product->getLocaleCode()); $this->assertEquals( - new Collection([$productAttribute]), + new ArrayCollection([$productAttribute]), $product->getAttributes() ); $this->assertEquals(1000, $product->getPrice()->getAmount()); @@ -182,7 +182,7 @@ public function it_creates_product_document_only_with_whitelisted_attributes() $this->assertEquals($createdAt, $product->getCreatedAt()); $this->assertEquals('Logan Mug', $product->getDescription()); $this->assertEquals($taxon, $product->getMainTaxon()); - $this->assertEquals(new Collection($productTaxons), $product->getTaxons()); + $this->assertEquals(new ArrayCollection($productTaxons), $product->getTaxons()); $this->assertEquals(0.0, $product->getAverageReviewRating()); }