Skip to content

Commit 3965e5e

Browse files
committed
Refactor MongoDBAdapter for clarity
1 parent e427e99 commit 3965e5e

File tree

1 file changed

+46
-22
lines changed

1 file changed

+46
-22
lines changed

src/Adapter/MongoDB/MongoDBAdapter.php

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
use Omines\DataTablesBundle\Adapter\AbstractAdapter;
1919
use Omines\DataTablesBundle\Adapter\AdapterQuery;
2020
use Omines\DataTablesBundle\Column\AbstractColumn;
21+
use Omines\DataTablesBundle\DataTable;
22+
use Omines\DataTablesBundle\DataTableState;
2123
use Symfony\Component\OptionsResolver\OptionsResolver;
2224

2325
/**
@@ -28,12 +30,13 @@
2830
class 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

Comments
 (0)