/** * Checks if value is a Filter * * @param mixed $value Value to evaluate * @param array $requirements Array of constraints * @return array Cleared value * @throws InvalidDataException If the value is not a Filter or fails constraints checks */ public static function checkFilters($value, array $requirements) { $filters = array(); if (is_array($value)) { // Check if we are dealing with filters or one Filter if (is_array($value[0])) { foreach ($value as $filter) { $filters[] = FilterType::check($filter, $requirements); } } else { $filters[] = FilterType::check($value, $requirements); } } return $filters; }
public function testFilterToCriterionPassBooleanType() { $filter = 'and-id-bool-value-true'; $this->assertInstanceOf('Ucc\\Data\\Filter\\Criterion\\Criterion', FilterType::criteriaToCriterion($filter)); $filter = 'and-id-bool-value-false'; $this->assertInstanceOf('Ucc\\Data\\Filter\\Criterion\\Criterion', FilterType::criteriaToCriterion($filter)); }
public function expandSimpleQueryProvider() { // test WHERE and SORT $data = array(); $options = array(); $query = new Query(); $sql = 'SELECT * FROM `products` '; $expectedSql = 'SELECT * FROM `products` WHERE (`name` LIKE CONCAT("%", :0_filter_0, "%") COLLATE utf8_general_ci OR `name` LIKE CONCAT("%", :0_filter_1, "%") COLLATE utf8_general_ci AND `price` > :0_filter_2) GROUP BY `name`,`price` ORDER BY `name` ASC,`price` DESC'; $expectedParams = array('0_filter_0' => 'galaxy', '0_filter_1' => '4s', '0_filter_2' => '100'); $query->setStatement($sql); $expected = new Query(); $expected->setStatement($expectedSql)->setParameters($expectedParams); $sort1 = new Sort(); $sort1->setField('name'); $sort2 = new Sort(); $sort2->setField('price')->setDirection('DESC'); $filterA = new Filter(); $criterions = array(FilterType::criteriaToCriterion('and-name-inci-value-galaxy'), FilterType::criteriaToCriterion('or-name-inci-value-4s'), FilterType::criteriaToCriterion('and-price-gt-value-100')); $filterA->setCriterions($criterions); $options = array('sort' => array($sort1, $sort2), 'group' => array('name', 'price'), 'filter' => array($filterA)); $data[] = array($query, $options, $expected); // test HAVING $query = new Query(); $query->setStatement($sql); $sql = 'SELECT * FROM `products` '; $expectedSql = 'SELECT * FROM `products` HAVING (`name` = CAST(`price` AS CHAR) COLLATE utf8_bin OR `clicks` > `price`)'; $expected = new Query(); $expected->setStatement($expectedSql); $fieldMap = array('name' => 'having'); $filterA = new Filter(); $criterions = array(FilterType::criteriaToCriterion('and-name-eq-field-price'), FilterType::criteriaToCriterion('or-clicks-gt-field-price')); $filterA->setCriterions($criterions); $options = array('filter' => array($filterA)); $data[] = array($query, $options, $expected, $fieldMap); // test * in field map $query = new Query(); $query->setStatement($sql); $sql = 'SELECT * FROM `products` '; $expectedSql = 'SELECT * FROM `products` HAVING (`name` = CAST(`price` AS CHAR) COLLATE utf8_bin OR `clicks` > `price`)'; $expected = new Query(); $expected->setStatement($expectedSql); $fieldMap = array('*' => 'having'); $filterA = new Filter(); $criterions = array(FilterType::criteriaToCriterion('and-name-eq-field-price'), FilterType::criteriaToCriterion('or-clicks-gt-field-price')); $filterA->setCriterions($criterions); $options = array('filter' => array($filterA)); $data[] = array($query, $options, $expected, $fieldMap); // test LIMIT and offset $query = new Query(); $query->setStatement($sql); $sql = 'SELECT * FROM `products` '; $expectedSql = 'SELECT * FROM `products` WHERE (`name` = CAST(`price` AS CHAR) COLLATE utf8_bin OR `clicks` > `price`) LIMIT 10,20'; $expected = new Query(); $expected->setStatement($expectedSql); $filterA = new Filter(); $criterions = array(FilterType::criteriaToCriterion('and-name-eq-field-price'), FilterType::criteriaToCriterion('or-clicks-gt-field-price')); $filterA->setCriterions($criterions); $options = array('filter' => array($filterA), 'limit' => 20, 'offset' => 10); $data[] = array($query, $options, $expected); // test Single Filter $sql = 'SELECT * FROM `orders` '; $querySingle = new Query(); $querySingle->setStatement($sql); $expectedSql = 'SELECT * FROM `orders` WHERE (`id` > :0_filter_0 AND `id` >= :0_filter_1) LIMIT 2,100'; $expectedParams = array('0_filter_0' => '1', '0_filter_1' => '2'); $expected = new Query(); $expected->setStatement($expectedSql)->setParameters($expectedParams); $filterSingle = new Filter(); $criterions = array(FilterType::criteriaToCriterion('and-id-gt-value-1'), FilterType::criteriaToCriterion('and-id-ge-value-2')); $filterSingle->setCriterions($criterions); $options = array('filter' => $filterSingle, 'limit' => 100, 'offset' => 2); $data[] = array($querySingle, $options, $expected); return $data; }
public function criterionOperandToMethodProvider() { $data = array(); // Bool compare $criterion = FilterType::criteriaToCriterion('and-foo-bool-value-1'); $expectedMethod = 'criterionToBool'; $data[] = array($criterion, $expectedMethod); $data[] = array($criterion, $expectedMethod); // Direct compare $criterion = FilterType::criteriaToCriterion('and-foo-nei-field-bar'); $expectedMethod = 'criterionToDirect'; $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-ne-field-bar'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-eq-field-bar'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-eqi-field-bar'); $data[] = array($criterion, $expectedMethod); // Relative compare $criterion = FilterType::criteriaToCriterion('and-foo-gt-field-bar'); $expectedMethod = 'criterionToRelative'; $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-ge-field-bar'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-lt-field-bar'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-le-field-bar'); $data[] = array($criterion, $expectedMethod); // Contains compare $criterion = FilterType::criteriaToCriterion('and-foo-inc-value-1,2,3'); $expectedMethod = 'criterionToContains'; $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-ninc-value-1,2,3'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-inci-value-1,2,3'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-ninci-value-1,2,3'); $data[] = array($criterion, $expectedMethod); // Begins with compare $criterion = FilterType::criteriaToCriterion('and-foo-begins-field-bar'); $expectedMethod = 'criterionToBegins'; $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-nbegins-field-bar'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-beginsi-field-bar'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-nbeginsi-field-bar'); $data[] = array($criterion, $expectedMethod); // Regex compare $criterion = FilterType::criteriaToCriterion('and-foo-re-value-^1'); $expectedMethod = 'criterionToRegex'; $data[] = array($criterion, $expectedMethod); // In compare $criterion = FilterType::criteriaToCriterion('and-foo-in-field-1,2,3'); $expectedMethod = 'criterionToIn'; $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-nin-field-1,2,3'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-ini-field-1,2,3'); $data[] = array($criterion, $expectedMethod); $criterion = FilterType::criteriaToCriterion('and-foo-nini-field-1,2,3'); $data[] = array($criterion, $expectedMethod); // No method $criterion = new Criterion(); $expectedMethod = false; $data[] = array($criterion, $expectedMethod); return $data; }