<?php

require __DIR__ . '/../vendor/autoload.php';
use Magento\Component\QueryLanguage\Expression\Transformer\Configuration;
use Magento\Component\QueryLanguage\Expression\Transformer\SQLTransformerBuilder;
use Magento\Component\QueryLanguage\Expression\Where;
// Build or hydrate query
$query = Where::all([Where::field('name')->contains('Snow'), Where::field('age')->between(25, 30)]);
// Initiate database connection
$pdo = new \PDO('sqlite::memory:');
// Load sample data
array_map([$pdo, 'exec'], ['CREATE TABLE people (id INT, name VARCHAR(10), age INT);', 'INSERT INTO people VALUES(1, "John Snow", 30);', 'INSERT INTO people VALUES(2, "Ramsay Snow", 31);']);
// Create transformer
$transformer = SQLTransformerBuilder::make()->build();
// Transform query into SQL clause
$clause = $transformer->transform($query, Configuration::make());
// Execute query
$stmt = $pdo->prepare('SELECT * FROM people WHERE ' . $clause->getWhere());
$stmt->execute($clause->getParameters());
// Fetch results
$people = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($people);
 public function testNestedExpression()
 {
     $sql = $this->transformer->transform(Where::any([Where::field('first_name')->equals('John'), Where::all([Where::field('last_name')->equals('Smith'), Where::field('age')->between(20, 40)]), Where::field('last_name')->contains('Jorge')]), $this->config);
     $this->assertEquals('(phpunit.first_name = ? OR (phpunit.last_name = ? AND (phpunit.age >= ? AND phpunit.age <= ?)) OR phpunit.last_name LIKE ?)', $sql->getWhere());
     $this->assertEquals(['John', 'Smith', 20, 40, '%Jorge%'], $sql->getParameters());
 }
 public function testAllMatch()
 {
     $filter = $this->transformer->transform(Where::all([Where::field('name')->equals('Jane'), Where::field('age')->equals(21)]), $this->config);
     $result = array_filter($this->data, $filter);
     $this->assertEquals(['jane'], array_keys($result));
 }
 public function testAllMatch()
 {
     $result = $this->find(Where::all([Where::field('name')->equals('Jane'), Where::field('age')->equals(21)]));
     $this->assertEquals(['jane'], $result);
 }