From 5c2421d5fb6cb57803d08ff019b1edbd284d0f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20H=C3=BCbner?= Date: Wed, 17 May 2017 20:22:13 +0200 Subject: [PATCH] Add Search Repositories and class --- .../Form/Filter/Model/CategoryFilterType.php | 52 ------------ src/AppBundle/Form/NumberRangeType.php | 37 ++++++++ src/AppBundle/Form/Search/ModelSearchType.php | 60 +++++++++++++ src/AppBundle/Form/Search/SetSearchType.php | 85 +++++++++++++++++++ src/AppBundle/Model/ModelSearch.php | 46 ++++++++++ src/AppBundle/Model/NumberRange.php | 44 ++++++++++ src/AppBundle/Model/SetSearch.php | 84 ++++++++++++++++++ .../Repository/Search/ModelRepository.php | 40 +++++++++ .../Repository/Search/SetRepository.php | 64 ++++++++++++++ 9 files changed, 460 insertions(+), 52 deletions(-) delete mode 100644 src/AppBundle/Form/Filter/Model/CategoryFilterType.php create mode 100644 src/AppBundle/Form/NumberRangeType.php create mode 100644 src/AppBundle/Form/Search/ModelSearchType.php create mode 100644 src/AppBundle/Form/Search/SetSearchType.php create mode 100644 src/AppBundle/Model/ModelSearch.php create mode 100644 src/AppBundle/Model/NumberRange.php create mode 100644 src/AppBundle/Model/SetSearch.php create mode 100644 src/AppBundle/Repository/Search/ModelRepository.php create mode 100644 src/AppBundle/Repository/Search/SetRepository.php diff --git a/src/AppBundle/Form/Filter/Model/CategoryFilterType.php b/src/AppBundle/Form/Filter/Model/CategoryFilterType.php deleted file mode 100644 index d0f71fc..0000000 --- a/src/AppBundle/Form/Filter/Model/CategoryFilterType.php +++ /dev/null @@ -1,52 +0,0 @@ -categoryRepository = $categoryRepository; - } - - public function buildForm(FormBuilderInterface $builder, array $options) - { - $builder->add('id', Filters\ChoiceFilterType::class, [ - 'choices' => $this->categoryRepository->findAll(), - 'choice_label' => 'name', - 'label' => 'filter.model.category', -// 'attr' => [ -// 'class' => 'ui dropdown search selection' -// ] - ]); - } - - public function getParent() - { - return Filters\SharedableFilterType::class; // this allow us to use the "add_shared" option - } - - public function getBlockPrefix() - { - return 'category_filter'; - } - - public function setDefaultOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => Category::class, - 'csrf_protection' => false, - 'validation_groups' => ['filtering'], // avoid NotBlank() constraint-related message - 'method' => 'GET', - ]); - } -} diff --git a/src/AppBundle/Form/NumberRangeType.php b/src/AppBundle/Form/NumberRangeType.php new file mode 100644 index 0000000..00370b0 --- /dev/null +++ b/src/AppBundle/Form/NumberRangeType.php @@ -0,0 +1,37 @@ +add('from', HiddenType::class, [ + 'required' => false, + 'data' => $attr['min'], + 'empty_data' => $attr['min'], + ]) + ->add('to', HiddenType::class, [ + 'required' => false, + 'data' => $attr['max'], + 'empty_data' => $attr['max'], + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'csrf_protection' => false, + 'data_class' => NumberRange::class, + ]); + } +} diff --git a/src/AppBundle/Form/Search/ModelSearchType.php b/src/AppBundle/Form/Search/ModelSearchType.php new file mode 100644 index 0000000..58c6f06 --- /dev/null +++ b/src/AppBundle/Form/Search/ModelSearchType.php @@ -0,0 +1,60 @@ +categoryRepository = $categoryRepository; + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder + ->add('query', TextType::class, [ + 'required' => false, + 'label' => 'model.form.search', + 'attr' => [ + 'placeholder' => 'model.form.search', + ], + ]) + ->add('category', ChoiceType::class, [ + 'label' => 'model.form.category', + 'choices' => $this->categoryRepository->findAll(), + 'placeholder' => 'model.form.category.all', + 'choice_label' => 'name', + 'choice_value' => 'id', + 'required' => false, + 'attr' => [ +// 'class' => 'ui dropdown search selection' + ], + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'csrf_protection' => false, + 'data_class' => ModelSearch::class, + 'method' => 'GET', + ]); + } + + public function getName() + { + return 'model_search_type'; + } +} diff --git a/src/AppBundle/Form/Search/SetSearchType.php b/src/AppBundle/Form/Search/SetSearchType.php new file mode 100644 index 0000000..60b2fda --- /dev/null +++ b/src/AppBundle/Form/Search/SetSearchType.php @@ -0,0 +1,85 @@ +themeRepository = $themeRepository; + $this->setRepository = $setRepository; + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder + ->add('query', TextType::class, [ + 'required' => false, + 'label' => 'set.form.search', + 'attr' => [ + 'placeholder' => 'set.form.search', + ], + ]) + ->add('year', NumberRangeType::class, [ + 'label' => 'set.form.year', + 'attr' => [ + 'step' => 1, + 'class' => 'slider', + 'min' => $this->setRepository->getMinYear(), + 'max' => $this->setRepository->getMaxYear(), + ], + ]) + ->add('partCount', NumberRangeType::class, [ + 'label' => 'set.form.partCount', + 'attr' => [ + 'class' => 'slider', + 'step' => 50, + 'min' => 0, + 'max' => $this->setRepository->getMaxPartCount(), + ], + ]) + ->add('theme', ChoiceType::class, [ + 'label' => 'set.form.theme', + 'choices' => $this->themeRepository->findAll(), + 'choice_label' => 'fullName', + 'choice_value' => 'id', + 'placeholder' => 'set.form.theme.all', + 'required' => false, + 'attr' => [ + 'placeholder' => 'set.form.theme.placeholder', + 'class' => 'select2 dropdown ui', + ], + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'csrf_protection' => false, + 'data_class' => SetSearch::class, + 'method' => 'GET' + ]); + } + + public function getName() + { + return 'set_search_type'; + } +} diff --git a/src/AppBundle/Model/ModelSearch.php b/src/AppBundle/Model/ModelSearch.php new file mode 100644 index 0000000..9c3e877 --- /dev/null +++ b/src/AppBundle/Model/ModelSearch.php @@ -0,0 +1,46 @@ +query; + } + + /** + * @param string $query + */ + public function setQuery($query) + { + $this->query = $query; + } + + /** + * @return Category + */ + public function getCategory() + { + return $this->category; + } + + /** + * @param Category $category + */ + public function setCategory($category) + { + $this->category = $category; + } +} diff --git a/src/AppBundle/Model/NumberRange.php b/src/AppBundle/Model/NumberRange.php new file mode 100644 index 0000000..fd4a8fe --- /dev/null +++ b/src/AppBundle/Model/NumberRange.php @@ -0,0 +1,44 @@ +from; + } + + /** + * @param int $from + */ + public function setFrom($from) + { + $this->from = $from; + } + + /** + * @return int + */ + public function getTo() + { + return $this->to; + } + + /** + * @param int $to + */ + public function setTo($to) + { + $this->to = $to; + } +} diff --git a/src/AppBundle/Model/SetSearch.php b/src/AppBundle/Model/SetSearch.php new file mode 100644 index 0000000..2391471 --- /dev/null +++ b/src/AppBundle/Model/SetSearch.php @@ -0,0 +1,84 @@ +query; + } + + /** + * @param string $query + */ + public function setQuery($query) + { + $this->query = $query; + } + + /** + * @return NumberRange + */ + public function getYear() + { + return $this->year; + } + + /** + * @param NumberRange $year + */ + public function setYear($year) + { + $this->year = $year; + } + + /** + * @return NumberRange + */ + public function getPartCount() + { + return $this->partCount; + } + + /** + * @param NumberRange $partCount + */ + public function setPartCount($partCount) + { + $this->partCount = $partCount; + } + + /** + * @return Theme + */ + public function getTheme() + { + return $this->theme; + } + + /** + * @param Theme $theme + */ + public function setTheme($theme) + { + $this->theme = $theme; + } +} diff --git a/src/AppBundle/Repository/Search/ModelRepository.php b/src/AppBundle/Repository/Search/ModelRepository.php new file mode 100644 index 0000000..89314da --- /dev/null +++ b/src/AppBundle/Repository/Search/ModelRepository.php @@ -0,0 +1,40 @@ +getQuery()) { + $query = new \Elastica\Query\MultiMatch(); + + $query->setFields(['name', 'id', 'aliases.id', 'keywords.name']); + $query->setQuery($searchQuery); + $query->setFuzziness(0.7); + $query->setMinimumShouldMatch('80%'); + } else { + $query = new \Elastica\Query\MatchAll(); + } + + $boolQuery->addMust($query); + + if ($modelSearch->getCategory()) { + $categoryQuery = new \Elastica\Query\Match(); + $categoryQuery->setField('category.id', $modelSearch->getCategory()->getId()); + $boolQuery->addFilter($categoryQuery); + } + + return $boolQuery; + } + + public function search(ModelSearch $modelSearch) + { + $query = $this->getSearchQuery($modelSearch); + return $this->find($query, 500); + } +} diff --git a/src/AppBundle/Repository/Search/SetRepository.php b/src/AppBundle/Repository/Search/SetRepository.php new file mode 100644 index 0000000..c20f8ce --- /dev/null +++ b/src/AppBundle/Repository/Search/SetRepository.php @@ -0,0 +1,64 @@ +getQuery()) { + $query = new MultiMatch(); + + $query->setFields(['name', 'id']); + $query->setQuery($searchQuery); + $query->setFuzziness(0.7); + $query->setMinimumShouldMatch('80%'); + } else { + $query = new \Elastica\Query\MatchAll(); + } + + $boolQuery->addMust($query); + + if ($setSearch->getTheme()) { + $themeQuery = new Match(); + $themeQuery->setField('theme.id', $setSearch->getTheme()->getId()); + $boolQuery->addFilter($themeQuery); + } + + if ($setSearch->getPartCount()) { + $range = new Range(); + $range->addField('partCount', [ + 'gte' => $setSearch->getPartCount()->getFrom(), + 'lte' => $setSearch->getPartCount()->getTo(), + ]); + $boolQuery->addFilter($range); + } + + if ($setSearch->getYear()) { + $range = new Range(); + $range->addField('year', [ + 'gte' => $setSearch->getYear()->getFrom(), + 'lte' => $setSearch->getYear()->getTo(), + ]); + $boolQuery->addFilter($range); + } + + return $boolQuery; + } + + + public function search(SetSearch $setSearch) + { + $query = $this->getSearchQuery($setSearch); + + return $this->find($query,500); + } +}