• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

contributte / datagrid / 8230157862

11 Mar 2024 09:02AM UTC coverage: 34.102%. First build
8230157862

Pull #1060

github

radimvaculik
Fix failing tests
Pull Request #1060: [7.x] Next

117 of 435 new or added lines in 54 files covered. (26.9%)

1124 of 3296 relevant lines covered (34.1%)

0.34 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

23.91
/src/DataModel.php
1
<?php declare(strict_types = 1);
2

3
namespace Contributte\Datagrid;
4

5
use Contributte\Datagrid\Components\DatagridPaginator\DatagridPaginator;
6
use Contributte\Datagrid\DataSource\ArrayDataSource;
7
use Contributte\Datagrid\DataSource\DibiFluentDataSource;
8
use Contributte\Datagrid\DataSource\DibiFluentMssqlDataSource;
9
use Contributte\Datagrid\DataSource\DibiFluentPostgreDataSource;
10
use Contributte\Datagrid\DataSource\DoctrineCollectionDataSource;
11
use Contributte\Datagrid\DataSource\DoctrineDataSource;
12
use Contributte\Datagrid\DataSource\IDataSource;
13
use Contributte\Datagrid\DataSource\NetteDatabaseTableDataSource;
14
use Contributte\Datagrid\DataSource\NetteDatabaseTableMssqlDataSource;
15
use Contributte\Datagrid\DataSource\NextrasDataSource;
16
use Contributte\Datagrid\Exception\DatagridWrongDataSourceException;
17
use Contributte\Datagrid\Utils\NetteDatabaseSelectionHelper;
18
use Contributte\Datagrid\Utils\Sorting;
19
use Dibi\Drivers\MsSqlDriver;
20
use Dibi\Drivers\OdbcDriver;
21
use Dibi\Drivers\PostgreDriver;
22
use Dibi\Drivers\SqlsrvDriver;
23
use Dibi\Fluent;
24
use Doctrine\Common\Collections\Collection;
25
use Doctrine\ORM\QueryBuilder;
26
use Nette\Database\Drivers\MsSqlDriver as NDBMsSqlDriver;
27
use Nette\Database\Drivers\SqlsrvDriver as NDBSqlsrvDriver;
28
use Nette\Database\Table\Selection;
29
use Nette\SmartObject;
30
use Nextras\Orm\Collection\ICollection;
31

32
/**
33
 * @method onBeforeFilter(IDataSource $dataSource)
34
 * @method onAfterFilter(IDataSource $dataSource)
35
 * @method onAfterPaginated(IDataSource $dataSource)
36
 */
37
final class DataModel
38
{
39

40
        use SmartObject;
41

42
        /** @var array|callable[] */
43
        public array $onBeforeFilter = [];
44

45
        /** @var array|callable[] */
46
        public array $onAfterFilter = [];
47

48
        /** @var array|callable[] */
49
        public array $onAfterPaginated = [];
50

51
        private IDataSource $dataSource;
52

53
        public function __construct(mixed $source, string $primaryKey)
1✔
54
        {
55
                if (is_array($source)) {
1✔
56
                        $source = new ArrayDataSource($source);
1✔
57

NEW
58
                } elseif ($source instanceof Fluent) {
×
59
                        $driver = $source->getConnection()->getDriver();
×
60

NEW
61
                        if ($driver instanceof OdbcDriver) {
×
62
                                $source = new DibiFluentMssqlDataSource($source, $primaryKey);
×
63

NEW
64
                        } elseif ($driver instanceof MsSqlDriver) {
×
65
                                $source = new DibiFluentMssqlDataSource($source, $primaryKey);
×
66

NEW
67
                        } elseif ($driver instanceof PostgreDriver) {
×
68
                                $source = new DibiFluentPostgreDataSource($source, $primaryKey);
×
69

NEW
70
                        } elseif ($driver instanceof SqlsrvDriver) {
×
71
                                $source = new DibiFluentMssqlDataSource($source, $primaryKey);
×
72

73
                        } else {
74
                                $source = new DibiFluentDataSource($source, $primaryKey);
×
75
                        }
76
                } elseif ($source instanceof Selection) {
×
77
                        $driver = NetteDatabaseSelectionHelper::getDriver($source);
×
78

NEW
79
                        $source = $driver instanceof NDBMsSqlDriver || $driver instanceof NDBSqlsrvDriver ? new NetteDatabaseTableMssqlDataSource($source, $primaryKey) : new NetteDatabaseTableDataSource($source, $primaryKey);
×
80
                } elseif ($source instanceof QueryBuilder) {
×
81
                        $source = new DoctrineDataSource($source, $primaryKey);
×
82

83
                } elseif ($source instanceof Collection) {
×
84
                        $source = new DoctrineCollectionDataSource($source, $primaryKey);
×
85

86
                } elseif ($source instanceof ICollection) {
×
87
                        $source = new NextrasDataSource($source, $primaryKey);
×
88

NEW
89
                } elseif (!($source instanceof IDataSource)) {
×
NEW
90
                        throw new DatagridWrongDataSourceException(sprintf(
×
NEW
91
                                'Datagrid can not take [%s] as data source.',
×
NEW
92
                                is_object($source) ? $source::class : 'null'
×
93
                        ));
94
                }
95

96
                $this->dataSource = $source;
1✔
97
        }
1✔
98

99
        public function getDataSource(): IDataSource
100
        {
101
                return $this->dataSource;
×
102
        }
103

104
        public function filterData(
1✔
105
                ?DatagridPaginator $paginatorComponent,
106
                Sorting $sorting,
107
                array $filters
108
        ): iterable
109
        {
110
                $this->onBeforeFilter($this->dataSource);
1✔
111

112
                $this->dataSource->filter($filters);
1✔
113

114
                $this->onAfterFilter($this->dataSource);
1✔
115

116
                /**
117
                 * Paginator is optional
118
                 */
119
                if ($paginatorComponent !== null) {
1✔
120
                        $paginator = $paginatorComponent->getPaginator();
×
121
                        $paginator->setItemCount($this->dataSource->getCount());
×
122

123
                        $this->dataSource->sort($sorting)->limit(
×
124
                                $paginator->getOffset(),
×
125
                                $paginator->getItemsPerPage()
×
126
                        );
127

128
                        $this->onAfterPaginated($this->dataSource);
×
129

130
                        return $this->dataSource->getData();
×
131
                }
132

133
                return $this->dataSource->sort($sorting)->getData();
1✔
134
        }
135

136
        public function filterRow(array $condition): mixed
137
        {
138
                $this->onBeforeFilter($this->dataSource);
×
139
                $this->onAfterFilter($this->dataSource);
×
140

141
                return $this->dataSource->filterOne($condition)->getData();
×
142
        }
143

144
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc