1818use Omines \DataTablesBundle \Adapter \AbstractAdapter ;
1919use Omines \DataTablesBundle \Adapter \AdapterQuery ;
2020use Omines \DataTablesBundle \Column \AbstractColumn ;
21+ use Omines \DataTablesBundle \DataTable ;
22+ use Omines \DataTablesBundle \DataTableState ;
2123use Symfony \Component \OptionsResolver \OptionsResolver ;
2224
2325/**
2830class MongoDBAdapter extends AbstractAdapter
2931{
3032 const SORT_MAP = [
31- ' asc ' => 1 ,
32- ' desc ' => -1 ,
33+ DataTable:: SORT_ASCENDING => 1 ,
34+ DataTable:: SORT_DESCENDING => -1 ,
3335 ];
3436
3537 /** @var Collection */
3638 private $ collection ;
39+
3740 /** @var array */
3841 private $ filters ;
3942
@@ -79,13 +82,32 @@ protected function getResults(AdapterQuery $query): \Traversable
7982 {
8083 $ state = $ query ->getState ();
8184
82- $ filter = $ this ->filters ;
83- $ options = [
84- 'limit ' => $ state ->getLength (),
85- 'skip ' => $ state ->getStart (),
86- 'sort ' => [],
87- ];
85+ $ filter = $ this ->buildFilter ($ state );
86+ $ options = $ this ->buildOptions ($ state );
87+
88+ $ query ->setFilteredRows ($ this ->collection ->count ($ filter ));
89+ $ cursor = $ this ->collection ->find ($ filter , $ options );
90+ $ cursor ->setTypeMap (['root ' => 'array ' , 'document ' => 'array ' ]);
91+
92+ /** @var BSONDocument $result */
93+ foreach ($ cursor as $ result ) {
94+ array_walk_recursive ($ result , function (&$ value ) {
95+ if ($ value instanceof UTCDateTime) {
96+ $ value = $ value ->toDateTime ();
97+ }
98+ });
8899
100+ yield $ result ;
101+ }
102+ }
103+
104+ /**
105+ * @param DataTableState $state
106+ * @return array
107+ */
108+ private function buildFilter (DataTableState $ state ): array
109+ {
110+ $ filter = $ this ->filters ;
89111 if (!empty ($ globalSearch = $ state ->getGlobalSearch ())) {
90112 foreach ($ state ->getDataTable ()->getColumns () as $ column ) {
91113 if ($ column ->isGlobalSearchable ()) {
@@ -95,27 +117,29 @@ protected function getResults(AdapterQuery $query): \Traversable
95117 $ filter = ['$or ' => $ filter ];
96118 }
97119
120+ return $ filter ;
121+ }
122+
123+ /**
124+ * @param DataTableState $state
125+ * @return array
126+ */
127+ private function buildOptions (DataTableState $ state ): array
128+ {
129+ $ options = [
130+ 'limit ' => $ state ->getLength (),
131+ 'skip ' => $ state ->getStart (),
132+ 'sort ' => [],
133+ ];
134+
98135 foreach ($ state ->getOrderBy () as list ($ column , $ direction )) {
99136 /** @var AbstractColumn $column */
100137 if ($ column ->isOrderable () && $ orderField = $ column ->getOrderField ()) {
101138 $ options ['sort ' ][$ orderField ] = self ::SORT_MAP [$ direction ];
102139 }
103140 }
104141
105- $ query ->setFilteredRows ($ this ->collection ->count ($ filter ));
106- $ cursor = $ this ->collection ->find ($ filter , $ options );
107- $ cursor ->setTypeMap (['root ' => 'array ' , 'document ' => 'array ' ]);
108-
109- /** @var BSONDocument $result */
110- foreach ($ cursor as $ result ) {
111- array_walk_recursive ($ result , function (&$ value ) {
112- if ($ value instanceof UTCDateTime) {
113- $ value = $ value ->toDateTime ();
114- }
115- });
116-
117- yield $ result ;
118- }
142+ return $ options ;
119143 }
120144
121145 /**
0 commit comments