88use Ibexa \Contracts \Core \Repository \Values \Content \Query ;
99use Ibexa \Contracts \Core \Repository \Values \Content \Search \SearchResult ;
1010use Ibexa \Core \QueryType \QueryTypeRegistry ;
11+ use Ibexa \Contracts \Core \Repository \Repository ;
1112use Netgen \IbexaSearchExtra \Core \Pagination \Pagerfanta \BaseAdapter ;
1213use Netgen \IbexaSiteApi \API \FilterService ;
1314use Netgen \IbexaSiteApi \API \FindService ;
1415use Netgen \IbexaSiteApi \Core \Site \Pagination \Pagerfanta \FilterAdapter ;
1516use Netgen \IbexaSiteApi \Core \Site \Pagination \Pagerfanta \FindAdapter ;
17+ use Netgen \IbexaSiteApi \Core \Site \Pagination \Pagerfanta \SudoFilterAdapter ;
18+ use Netgen \IbexaSiteApi \Core \Site \Pagination \Pagerfanta \SudoFindAdapter ;
1619use Pagerfanta \Pagerfanta ;
1720
1821/**
@@ -26,6 +29,7 @@ public function __construct(
2629 private readonly QueryTypeRegistry $ queryTypeRegistry ,
2730 private readonly FilterService $ filterService ,
2831 private readonly FindService $ findService ,
32+ private readonly Repository $ repository ,
2933 ) {
3034 }
3135
@@ -44,6 +48,21 @@ public function execute(QueryDefinition $queryDefinition): Pagerfanta
4448 return $ pager ;
4549 }
4650
51+ /**
52+ * Execute the Query with the given $name and return the result using repository sudo.
53+ */
54+ public function sudoExecute (QueryDefinition $ queryDefinition ): Pagerfanta
55+ {
56+ $ adapter = $ this ->getSudoPagerAdapter ($ queryDefinition );
57+ $ pager = new Pagerfanta ($ adapter );
58+
59+ $ pager ->setNormalizeOutOfRangePages (true );
60+ $ pager ->setMaxPerPage ($ queryDefinition ->maxPerPage );
61+ $ pager ->setCurrentPage ($ queryDefinition ->page );
62+
63+ return $ pager ;
64+ }
65+
4766 /**
4867 * Execute the Query with the given $name and return the result.
4968 */
@@ -58,6 +77,24 @@ public function executeRaw(QueryDefinition $queryDefinition): SearchResult
5877 return $ this ->getContentResult ($ query , $ queryDefinition );
5978 }
6079
80+ /**
81+ * Execute the Query with the given $name and return the result using repository sudo.
82+ */
83+ public function sudoExecuteRaw (QueryDefinition $ queryDefinition ): SearchResult
84+ {
85+ $ query = $ this ->getQuery ($ queryDefinition );
86+
87+ if ($ query instanceof LocationQuery) {
88+ return $ this ->repository ->sudo (
89+ fn () => $ this ->getLocationResult ($ query , $ queryDefinition ),
90+ );
91+ }
92+
93+ return $ this ->repository ->sudo (
94+ fn () => $ this ->getContentResult ($ query , $ queryDefinition ),
95+ );
96+ }
97+
6198 private function getPagerAdapter (QueryDefinition $ queryDefinition ): BaseAdapter
6299 {
63100 $ query = $ this ->getQuery ($ queryDefinition );
@@ -69,6 +106,17 @@ private function getPagerAdapter(QueryDefinition $queryDefinition): BaseAdapter
69106 return new FindAdapter ($ query , $ this ->findService );
70107 }
71108
109+ private function getSudoPagerAdapter (QueryDefinition $ queryDefinition ): BaseAdapter
110+ {
111+ $ query = $ this ->getQuery ($ queryDefinition );
112+
113+ if ($ queryDefinition ->useFilter ) {
114+ return new SudoFilterAdapter ($ query , $ this ->filterService , $ this ->repository );
115+ }
116+
117+ return new SudoFindAdapter ($ query , $ this ->findService , $ this ->repository );
118+ }
119+
72120 private function getLocationResult (LocationQuery $ query , QueryDefinition $ queryDefinition ): SearchResult
73121 {
74122 if ($ queryDefinition ->useFilter ) {
0 commit comments