netdudes / data-sourcery-bundle
Netdudes DataSourceryBundle
Installs: 7 189
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 5
Forks: 1
Open Issues: 2
Type:symfony-bundle
pkg:composer/netdudes/data-sourcery-bundle
Requires
- php: >=7.0
- doctrine/doctrine-bundle: ^1.6
- doctrine/orm: ^2.5
- symfony/symfony: >=2.3
Requires (Dev)
This package is auto-updated.
Last update: 2020-08-11 18:48:35 UTC
README
****** WARNING: THIS PROJECT IS NO LONGER MAINTAINED!! ******
Netdudes\DataSourceryBundle
DataSourceryBundle is a neat tool to handle building and performing complex queries on data sets, including support for natural-language queries and safe handling of user provided query parameters.
Usage (work in progress!)
Assume we have one entity in our system managed by Doctrine, called User, that looks like this:
User {
string username
string nameFirst
string nameLast
\DateTime registered
User bestFriend => OtM with another user
User worstEnemy => OtM with another user
}
You can get the building block of the library, the DataSource, from a builder. From here and now on we will assume you have a DI container (e.g. Symfony) where the needed services are registered.
$dataSourceBuilder = $container ->get('netdudes_data_sourcery.data_source.factory') ->createBuilder('My\Entities\User');
With a builder is easy to create a Datasource
$dataSourceBuilder ->addField('username', 'string', 'username') ->addField('bestFriendUsername' 'string', 'bestFriend.username') ->addField('worstEnemyUsername', 'string', 'worstEnemy.username') ->addField('friendOfMyEnemyUsername', 'string', 'worstEnemy.bestFriend.username') ->addField('registered', 'date', 'registered'); $dataSource = $dataSourceBuilder->build();
Alternatively, a data source can be generated from a configuration class, very similarly to how Symfony Forms are built.
class MyNiceDataSourceConfig implements DataSourceConfigurationInterface { public function getEntityClass() { return 'My\Entities\User'; } public function buildDataSource(DataSourceBuilderInterface $builder) { $builder ->addField('username', 'string', 'username') ->addField('bestFriendUsername', 'string', 'bestFriend.username') ->addField('worstEnemyUsername', 'string', 'worstEnemy.username') ->addField('friendOfMyEnemyUsername', 'string', 'worstEnemy.bestFriend.username') ->addField('registered', 'date', 'registered'); } } $dataSource = $container ->get('netdudes_data_sourcery.data_source.factory') ->createFromConfiguration(new MyNiceDataSourceConfig());
In order to query you data source, you must have a Query object. Creating one manually is easy:
$query = new Query(); $query->setSelect(['username', 'bestFriendUsername', 'worstEnemyUsername', 'friendOfMyEnemyUsername', 'registered']); $filter = new Filter( [ new FilterCondition('username', FilterCondition::METHOD_STRING_EQ, 'admin') ] ); $query->setFilter($filter);
Alternatively you can use the built in parser for the system's language, UQL:
$uqlInterpreter = $container->get('netdudes_data_sourcery.uql.interpreter.factory')->create($dataSource); $filter = $uqlInterpreter->generateFilters('username != "admin"'); $query->setFilter($filter);
Finally, you can get your data from the data source
$data = $dataSource->getData($query); dump($data);
Giving
array:1 [ 0 => array:5 [ "username" => "admin" "bestFriendUsername" => "Max" "worstEnemyUsername" => "John" "friendOfMyEnemyUsername" => "Max" "registered" => DateTime {#124 +"date": "2014-02-01 00:00:00.000000" +"timezone_type": 3 +"timezone": "Europe/Berlin" } ] ]