Complex classes like QueryBuilder often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use QueryBuilder, and based on these observations, apply Extract Interface, too.
| 1 | <?php  | 
            ||
| 55 | class QueryBuilder { | 
            ||
| 56 | |||
| 57 | /**  | 
            ||
| 58 | * Additional filters, which will be added to the query, as well as to  | 
            ||
| 59 | * suggest queries.  | 
            ||
| 60 | *  | 
            ||
| 61 | * @var array  | 
            ||
| 62 | */  | 
            ||
| 63 | protected $additionalFilters = [];  | 
            ||
| 64 | |||
| 65 | /**  | 
            ||
| 66 | * @var TypoScriptConfiguration  | 
            ||
| 67 | */  | 
            ||
| 68 | protected $typoScriptConfiguration = null;  | 
            ||
| 69 | |||
| 70 | /**  | 
            ||
| 71 | * @var SolrLogManager;  | 
            ||
| 72 | */  | 
            ||
| 73 | protected $logger = null;  | 
            ||
| 74 | |||
| 75 | /**  | 
            ||
| 76 | * @var SiteHashService  | 
            ||
| 77 | */  | 
            ||
| 78 | protected $siteHashService = null;  | 
            ||
| 79 | |||
| 80 | /**  | 
            ||
| 81 | * @var Query  | 
            ||
| 82 | */  | 
            ||
| 83 | protected $queryToBuild = null;  | 
            ||
| 84 | |||
| 85 | /**  | 
            ||
| 86 | * QueryBuilder constructor.  | 
            ||
| 87 | * @param TypoScriptConfiguration|null $configuration  | 
            ||
| 88 | * @param SolrLogManager|null $solrLogManager  | 
            ||
| 89 | * @param SiteHashService|null $siteHashService  | 
            ||
| 90 | */  | 
            ||
| 91 | public function __construct(TypoScriptConfiguration $configuration = null, SolrLogManager $solrLogManager = null, SiteHashService $siteHashService = null)  | 
            ||
| 97 | |||
| 98 | /**  | 
            ||
| 99 | * @param Query $query  | 
            ||
| 100 | * @return QueryBuilder  | 
            ||
| 101 | */  | 
            ||
| 102 | public function startFrom(Query $query): QueryBuilder  | 
            ||
| 107 | |||
| 108 | /**  | 
            ||
| 109 | * @param string $queryString  | 
            ||
| 110 | * @return QueryBuilder  | 
            ||
| 111 | */  | 
            ||
| 112 | public function newSearchQuery($queryString): QueryBuilder  | 
            ||
| 117 | |||
| 118 | /**  | 
            ||
| 119 | * @param string $queryString  | 
            ||
| 120 | * @return QueryBuilder  | 
            ||
| 121 | */  | 
            ||
| 122 | public function newSuggestQuery($queryString): QueryBuilder  | 
            ||
| 127 | |||
| 128 | /**  | 
            ||
| 129 | * @return Query  | 
            ||
| 130 | */  | 
            ||
| 131 | public function getQuery(): Query  | 
            ||
| 135 | |||
| 136 | /**  | 
            ||
| 137 | * Initializes the Query object and SearchComponents and returns  | 
            ||
| 138 | * the initialized query object, when a search should be executed.  | 
            ||
| 139 | *  | 
            ||
| 140 | * @param string|null $rawQuery  | 
            ||
| 141 | * @param int $resultsPerPage  | 
            ||
| 142 | * @return Query  | 
            ||
| 143 | */  | 
            ||
| 144 | public function buildSearchQuery($rawQuery, $resultsPerPage = 10) : Query  | 
            ||
| 166 | |||
| 167 | /**  | 
            ||
| 168 | * Builds a SuggestQuery with all applied filters.  | 
            ||
| 169 | *  | 
            ||
| 170 | * @param string $queryString  | 
            ||
| 171 | * @param string $additionalFilters  | 
            ||
| 172 | * @param integer $requestedPageId  | 
            ||
| 173 | * @param string $groupList  | 
            ||
| 174 | * @return SuggestQuery  | 
            ||
| 175 | */  | 
            ||
| 176 | public function buildSuggestQuery(string $queryString, string $additionalFilters, int $requestedPageId, string $groupList) : SuggestQuery  | 
            ||
| 193 | |||
| 194 | /**  | 
            ||
| 195 | * Uses an array of filters and applies them to the query.  | 
            ||
| 196 | *  | 
            ||
| 197 | * @param array $filterArray  | 
            ||
| 198 | * @return QueryBuilder  | 
            ||
| 199 | */  | 
            ||
| 200 | public function useFilterArray(array $filterArray): QueryBuilder  | 
            ||
| 208 | |||
| 209 | /**  | 
            ||
| 210 | * Returns Query for Search which finds document for given page.  | 
            ||
| 211 | * Note: The Connection is per language as recommended in ext-solr docs.  | 
            ||
| 212 | *  | 
            ||
| 213 | * @return Query  | 
            ||
| 214 | */  | 
            ||
| 215 | public function buildPageQuery($pageId)  | 
            ||
| 230 | |||
| 231 | /**  | 
            ||
| 232 | * Returns a query for single record  | 
            ||
| 233 | *  | 
            ||
| 234 | * @return Query  | 
            ||
| 235 | */  | 
            ||
| 236 | public function buildRecordQuery($type, $uid, $pageId): Query  | 
            ||
| 251 | |||
| 252 | /**  | 
            ||
| 253 | * Applies the queryString that is used to search  | 
            ||
| 254 | *  | 
            ||
| 255 | * @param string $queryString  | 
            ||
| 256 | * @return QueryBuilder  | 
            ||
| 257 | */  | 
            ||
| 258 | public function useQueryString($queryString): QueryBuilder  | 
            ||
| 263 | |||
| 264 | /**  | 
            ||
| 265 | * Applies the useRawQueryString flag to the queryString.  | 
            ||
| 266 | *  | 
            ||
| 267 | * @param boolean $boolean  | 
            ||
| 268 | * @return QueryBuilder  | 
            ||
| 269 | */  | 
            ||
| 270 | public function useRawQueryString($boolean = true): QueryBuilder  | 
            ||
| 275 | |||
| 276 | /**  | 
            ||
| 277 | * Applies the passed queryType to the query.  | 
            ||
| 278 | *  | 
            ||
| 279 | * @param string $queryType  | 
            ||
| 280 | * @return QueryBuilder  | 
            ||
| 281 | */  | 
            ||
| 282 | public function useQueryType($queryType): QueryBuilder  | 
            ||
| 287 | |||
| 288 | /**  | 
            ||
| 289 | * Applies the passed sorting to the query.  | 
            ||
| 290 | *  | 
            ||
| 291 | * @param string $sorting  | 
            ||
| 292 | * @return QueryBuilder  | 
            ||
| 293 | */  | 
            ||
| 294 | public function useSorting($sorting): QueryBuilder  | 
            ||
| 299 | |||
| 300 | /**  | 
            ||
| 301 | * @param int $resultsPerPage  | 
            ||
| 302 | * @return QueryBuilder  | 
            ||
| 303 | */  | 
            ||
| 304 | public function useResultsPerPage($resultsPerPage): QueryBuilder  | 
            ||
| 309 | |||
| 310 | /**  | 
            ||
| 311 | * @param int $page  | 
            ||
| 312 | * @return QueryBuilder  | 
            ||
| 313 | */  | 
            ||
| 314 | public function usePage($page): QueryBuilder  | 
            ||
| 319 | |||
| 320 | /**  | 
            ||
| 321 | * @param Operator $operator  | 
            ||
| 322 | * @return QueryBuilder  | 
            ||
| 323 | */  | 
            ||
| 324 | public function useOperator(Operator $operator): QueryBuilder  | 
            ||
| 329 | |||
| 330 | /**  | 
            ||
| 331 | * @return QueryBuilder  | 
            ||
| 332 | */  | 
            ||
| 333 | public function useSlopsFromTypoScript(): QueryBuilder  | 
            ||
| 337 | |||
| 338 | /**  | 
            ||
| 339 | * @param Slops $slops  | 
            ||
| 340 | * @return QueryBuilder  | 
            ||
| 341 | */  | 
            ||
| 342 | public function useSlops(Slops $slops): QueryBuilder  | 
            ||
| 347 | |||
| 348 | /**  | 
            ||
| 349 | * Uses the configured boost queries from typoscript  | 
            ||
| 350 | *  | 
            ||
| 351 | * @return QueryBuilder  | 
            ||
| 352 | */  | 
            ||
| 353 | public function useBoostQueriesFromTypoScript(): QueryBuilder  | 
            ||
| 368 | |||
| 369 | /**  | 
            ||
| 370 | * Uses the passed boostQuer(y|ies) for the query.  | 
            ||
| 371 | *  | 
            ||
| 372 | * @param string|array $boostQueries  | 
            ||
| 373 | * @return QueryBuilder  | 
            ||
| 374 | */  | 
            ||
| 375 | public function useBoostQueries($boostQueries): QueryBuilder  | 
            ||
| 380 | |||
| 381 | /**  | 
            ||
| 382 | * Uses the configured boostFunction from the typoscript configuration.  | 
            ||
| 383 | *  | 
            ||
| 384 | * @return QueryBuilder  | 
            ||
| 385 | */  | 
            ||
| 386 | public function useBoostFunctionFromTypoScript(): QueryBuilder  | 
            ||
| 395 | |||
| 396 | /**  | 
            ||
| 397 | * Uses the passed boostFunction for the query.  | 
            ||
| 398 | *  | 
            ||
| 399 | * @param string $boostFunction  | 
            ||
| 400 | * @return QueryBuilder  | 
            ||
| 401 | */  | 
            ||
| 402 | public function useBoostFunction($boostFunction): QueryBuilder  | 
            ||
| 407 | |||
| 408 | /**  | 
            ||
| 409 | * Uses the configured minimumMatch from the typoscript configuration.  | 
            ||
| 410 | *  | 
            ||
| 411 | * @return QueryBuilder  | 
            ||
| 412 | */  | 
            ||
| 413 | public function useMinimumMatchFromTypoScript(): QueryBuilder  | 
            ||
| 422 | |||
| 423 | /**  | 
            ||
| 424 | * Uses the passed minimumMatch(mm) for the query.  | 
            ||
| 425 | *  | 
            ||
| 426 | * @param string $boostFunction  | 
            ||
| 427 | * @return QueryBuilder  | 
            ||
| 428 | */  | 
            ||
| 429 | public function useMinimumMatch($boostFunction): QueryBuilder  | 
            ||
| 434 | |||
| 435 | /**  | 
            ||
| 436 | * @return QueryBuilder  | 
            ||
| 437 | */  | 
            ||
| 438 | public function useTieParameterFromTypoScript(): QueryBuilder  | 
            ||
| 447 | |||
| 448 | /**  | 
            ||
| 449 | * Applies the tie parameter to the query.  | 
            ||
| 450 | *  | 
            ||
| 451 | * @param mixed $tie  | 
            ||
| 452 | * @return QueryBuilder  | 
            ||
| 453 | */  | 
            ||
| 454 | public function useTieParameter($tie): QueryBuilder  | 
            ||
| 459 | |||
| 460 | /**  | 
            ||
| 461 | * Applies the configured query fields from the typoscript configuration.  | 
            ||
| 462 | *  | 
            ||
| 463 | * @return QueryBuilder  | 
            ||
| 464 | */  | 
            ||
| 465 | public function useQueryFieldsFromTypoScript(): QueryBuilder  | 
            ||
| 469 | |||
| 470 | /**  | 
            ||
| 471 | * Applies custom QueryFields to the query.  | 
            ||
| 472 | *  | 
            ||
| 473 | * @param QueryFields $queryFields  | 
            ||
| 474 | * @return QueryBuilder  | 
            ||
| 475 | */  | 
            ||
| 476 | public function useQueryFields(QueryFields $queryFields): QueryBuilder  | 
            ||
| 481 | |||
| 482 | /**  | 
            ||
| 483 | * Applies the configured return fields from the typoscript configuration.  | 
            ||
| 484 | *  | 
            ||
| 485 | * @return QueryBuilder  | 
            ||
| 486 | */  | 
            ||
| 487 | public function useReturnFieldsFromTypoScript(): QueryBuilder  | 
            ||
| 492 | |||
| 493 | /**  | 
            ||
| 494 | * Applies custom ReturnFields to the query.  | 
            ||
| 495 | *  | 
            ||
| 496 | * @param ReturnFields $returnFields  | 
            ||
| 497 | * @return QueryBuilder  | 
            ||
| 498 | */  | 
            ||
| 499 | public function useReturnFields(ReturnFields $returnFields): QueryBuilder  | 
            ||
| 504 | |||
| 505 | /**  | 
            ||
| 506 | * Can be used to apply the allowed sites from plugin.tx_solr.search.query.allowedSites to the query.  | 
            ||
| 507 | *  | 
            ||
| 508 | * @param int $requestedPageId  | 
            ||
| 509 | * @return QueryBuilder  | 
            ||
| 510 | */  | 
            ||
| 511 | public function useSiteHashFromTypoScript(int $requestedPageId): QueryBuilder  | 
            ||
| 517 | |||
| 518 | /**  | 
            ||
| 519 | * Can be used to apply a list of allowed sites to the query.  | 
            ||
| 520 | *  | 
            ||
| 521 | * @param string $allowedSites  | 
            ||
| 522 | * @return QueryBuilder  | 
            ||
| 523 | */  | 
            ||
| 524 | public function useSiteHashFromAllowedSites($allowedSites): QueryBuilder  | 
            ||
| 542 | |||
| 543 | /**  | 
            ||
| 544 | * Can be used to use a specific filter string in the solr query.  | 
            ||
| 545 | *  | 
            ||
| 546 | * @param string $filterString  | 
            ||
| 547 | * @param string $filterName  | 
            ||
| 548 | * @return QueryBuilder  | 
            ||
| 549 | */  | 
            ||
| 550 | public function useFilter($filterString, $filterName = ''): QueryBuilder  | 
            ||
| 555 | |||
| 556 | /**  | 
            ||
| 557 | * Can be used to filter the result on an applied list of user groups.  | 
            ||
| 558 | *  | 
            ||
| 559 | * @param array $groups  | 
            ||
| 560 | * @return QueryBuilder  | 
            ||
| 561 | */  | 
            ||
| 562 | public function useUserAccessGroups(array $groups): QueryBuilder  | 
            ||
| 572 | |||
| 573 | /**  | 
            ||
| 574 | * Applies the configured initial query settings to set the alternative query for solr as required.  | 
            ||
| 575 | *  | 
            ||
| 576 | * @return QueryBuilder  | 
            ||
| 577 | */  | 
            ||
| 578 | public function useInitialQueryFromTypoScript(): QueryBuilder  | 
            ||
| 592 | |||
| 593 | /**  | 
            ||
| 594 | * Applies the configured facets from the typoscript configuration on the query.  | 
            ||
| 595 | *  | 
            ||
| 596 | * @return QueryBuilder  | 
            ||
| 597 | */  | 
            ||
| 598 | public function useFacetingFromTypoScript(): QueryBuilder  | 
            ||
| 602 | |||
| 603 | /**  | 
            ||
| 604 | * Applies a custom Faceting configuration to the query.  | 
            ||
| 605 | *  | 
            ||
| 606 | * @param Faceting $faceting  | 
            ||
| 607 | * @return QueryBuilder  | 
            ||
| 608 | */  | 
            ||
| 609 | public function useFaceting(Faceting $faceting): QueryBuilder  | 
            ||
| 614 | |||
| 615 | /**  | 
            ||
| 616 | * Applies the configured variants from the typoscript configuration on the query.  | 
            ||
| 617 | *  | 
            ||
| 618 | * @return QueryBuilder  | 
            ||
| 619 | */  | 
            ||
| 620 | public function useVariantsFromTypoScript(): QueryBuilder  | 
            ||
| 624 | |||
| 625 | /**  | 
            ||
| 626 | * @param FieldCollapsing $fieldCollapsing  | 
            ||
| 627 | * @return QueryBuilder  | 
            ||
| 628 | */  | 
            ||
| 629 | public function useFieldCollapsing(FieldCollapsing $fieldCollapsing): QueryBuilder  | 
            ||
| 634 | |||
| 635 | /**  | 
            ||
| 636 | * Applies the configured groupings from the typoscript configuration to the query.  | 
            ||
| 637 | *  | 
            ||
| 638 | * @return QueryBuilder  | 
            ||
| 639 | */  | 
            ||
| 640 | public function useGroupingFromTypoScript(): QueryBuilder  | 
            ||
| 644 | |||
| 645 | /**  | 
            ||
| 646 | * Applies a custom initialized grouping to the query.  | 
            ||
| 647 | *  | 
            ||
| 648 | * @param Grouping $grouping  | 
            ||
| 649 | * @return QueryBuilder  | 
            ||
| 650 | */  | 
            ||
| 651 | public function useGrouping(Grouping $grouping): QueryBuilder  | 
            ||
| 656 | |||
| 657 | /**  | 
            ||
| 658 | * Applies the configured highlighting from the typoscript configuration to the query.  | 
            ||
| 659 | *  | 
            ||
| 660 | * @return QueryBuilder  | 
            ||
| 661 | */  | 
            ||
| 662 | public function useHighlightingFromTypoScript(): QueryBuilder  | 
            ||
| 666 | |||
| 667 | /**  | 
            ||
| 668 | * @param Highlighting $highlighting  | 
            ||
| 669 | * @return QueryBuilder  | 
            ||
| 670 | */  | 
            ||
| 671 | public function useHighlighting(Highlighting $highlighting): QueryBuilder  | 
            ||
| 676 | |||
| 677 | /**  | 
            ||
| 678 | * Applies the configured filters (page section and other from typoscript).  | 
            ||
| 679 | *  | 
            ||
| 680 | * @return QueryBuilder  | 
            ||
| 681 | */  | 
            ||
| 682 | public function useFiltersFromTypoScript(): QueryBuilder  | 
            ||
| 704 | |||
| 705 | /**  | 
            ||
| 706 | * Applies the configured elevation from the typoscript configuration.  | 
            ||
| 707 | *  | 
            ||
| 708 | * @return QueryBuilder  | 
            ||
| 709 | */  | 
            ||
| 710 | public function useElevationFromTypoScript(): QueryBuilder  | 
            ||
| 714 | |||
| 715 | /**  | 
            ||
| 716 | * @param Elevation $elevation  | 
            ||
| 717 | * @return QueryBuilder  | 
            ||
| 718 | */  | 
            ||
| 719 | public function useElevation(Elevation $elevation): QueryBuilder  | 
            ||
| 724 | |||
| 725 | /**  | 
            ||
| 726 | * Applies the configured spellchecking from the typoscript configuration.  | 
            ||
| 727 | *  | 
            ||
| 728 | * @return QueryBuilder  | 
            ||
| 729 | */  | 
            ||
| 730 | public function useSpellcheckingFromTypoScript(): QueryBuilder  | 
            ||
| 734 | |||
| 735 | /**  | 
            ||
| 736 | * @param Spellchecking $spellchecking  | 
            ||
| 737 | * @return QueryBuilder  | 
            ||
| 738 | */  | 
            ||
| 739 | public function useSpellchecking(Spellchecking $spellchecking): QueryBuilder  | 
            ||
| 744 | |||
| 745 | /**  | 
            ||
| 746 | * Applies the passed pageIds as __pageSection filter.  | 
            ||
| 747 | *  | 
            ||
| 748 | * @param array $pageIds  | 
            ||
| 749 | * @return QueryBuilder  | 
            ||
| 750 | */  | 
            ||
| 751 | public function usePageSectionsFromPageIds(array $pageIds = []): QueryBuilder  | 
            ||
| 767 | |||
| 768 | /**  | 
            ||
| 769 | * Applies the configured phrase fields from the typoscript configuration to the query.  | 
            ||
| 770 | *  | 
            ||
| 771 | * @return QueryBuilder  | 
            ||
| 772 | */  | 
            ||
| 773 | public function usePhraseFieldsFromTypoScript(): QueryBuilder  | 
            ||
| 777 | |||
| 778 | /**  | 
            ||
| 779 | * Applies a custom configured PhraseFields to the query.  | 
            ||
| 780 | *  | 
            ||
| 781 | * @param PhraseFields $phraseFields  | 
            ||
| 782 | * @return QueryBuilder  | 
            ||
| 783 | */  | 
            ||
| 784 | public function usePhraseFields(PhraseFields $phraseFields): QueryBuilder  | 
            ||
| 789 | |||
| 790 | /**  | 
            ||
| 791 | * Applies the configured bigram phrase fields from the typoscript configuration to the query.  | 
            ||
| 792 | *  | 
            ||
| 793 | * @return QueryBuilder  | 
            ||
| 794 | */  | 
            ||
| 795 | public function useBigramPhraseFieldsFromTypoScript(): QueryBuilder  | 
            ||
| 799 | |||
| 800 | /**  | 
            ||
| 801 | * Applies a custom configured BigramPhraseFields to the query.  | 
            ||
| 802 | *  | 
            ||
| 803 | * @param BigramPhraseFields $bigramPhraseFields  | 
            ||
| 804 | * @return QueryBuilder  | 
            ||
| 805 | */  | 
            ||
| 806 | public function useBigramPhraseFields(BigramPhraseFields $bigramPhraseFields): QueryBuilder  | 
            ||
| 811 | |||
| 812 | /**  | 
            ||
| 813 | * Applies the configured trigram phrase fields from the typoscript configuration to the query.  | 
            ||
| 814 | *  | 
            ||
| 815 | * @return QueryBuilder  | 
            ||
| 816 | */  | 
            ||
| 817 | public function useTrigramPhraseFieldsFromTypoScript(): QueryBuilder  | 
            ||
| 821 | |||
| 822 | /**  | 
            ||
| 823 | * Applies a custom configured TrigramPhraseFields to the query.  | 
            ||
| 824 | *  | 
            ||
| 825 | * @param TrigramPhraseFields $trigramPhraseFields  | 
            ||
| 826 | * @return QueryBuilder  | 
            ||
| 827 | */  | 
            ||
| 828 | public function useTrigramPhraseFields(TrigramPhraseFields $trigramPhraseFields): QueryBuilder  | 
            ||
| 833 | |||
| 834 | /**  | 
            ||
| 835 | * Retrieves the configuration filters from the TypoScript configuration, except the __pageSections filter.  | 
            ||
| 836 | *  | 
            ||
| 837 | * @return array  | 
            ||
| 838 | */  | 
            ||
| 839 | public function getAdditionalFilters() : array  | 
            ||
| 875 | |||
| 876 | /**  | 
            ||
| 877 | * @param string $rawQuery  | 
            ||
| 878 | * @return Query|object  | 
            ||
| 879 | */  | 
            ||
| 880 | protected function getQueryInstance($rawQuery): Query  | 
            ||
| 885 | |||
| 886 | |||
| 887 | /**  | 
            ||
| 888 | * @param string $rawQuery  | 
            ||
| 889 | * @return SuggestQuery  | 
            ||
| 890 | */  | 
            ||
| 891 | protected function getSuggestQueryInstance($rawQuery): SuggestQuery  | 
            ||
| 896 | }  |