Files
pathfinder/app/app/cortex/test_syntax.php

364 lines
7.0 KiB
PHP

<?php
use App\Controller;
class Test_Syntax {
function run($db,$type)
{
$test = new \Test();
$tname = 'test_cortex';
\DB\Cortex::setdown($db, $tname);
$fields = array(
'title' => array('type' => \DB\SQL\Schema::DT_TEXT),
'num1' => array('type' => \DB\SQL\Schema::DT_INT4),
'num2' => array('type' => \DB\SQL\Schema::DT_INT4),
);
\DB\Cortex::setup($db, $tname, $fields);
// adding some testing data
$cx = new \DB\Cortex($db, $tname);
$cx->title = 'bar1';
$cx->save();
$cx->reset();
$cx->title = 'baz2';
$cx->num1 = 1;
$cx->save();
$cx->reset();
$cx->title = 'foo3';
$cx->num1 = 4;
$cx->save();
$cx->reset();
$cx->title = 'foo4';
$cx->num1 = 3;
$cx->save();
$cx->reset();
$cx->title = 'foo5';
$cx->num1 = 3;
$cx->num2 = 5;
$cx->save();
$cx->reset();
$cx->title = 'foo6';
$cx->num1 = 3;
$cx->num2 = 1;
$cx->save();
$cx->reset();
$cx->title = 'foo7';
$cx->num1 = 3;
$cx->num2 = 10;
$cx->save();
$cx->reset();
$cx->title = 'foo8';
$cx->num1 = 5;
$cx->save();
$cx->reset();
$cx->title = 'foo9';
$cx->num1 = 8;
$cx->save();
$cx->reset();
$result = $this->getResult($cx->find());
$expected = array(
0 => array(
'title' => 'bar1',
),
1 => array(
'num1' => 1,
'title' => 'baz2',
),
2 => array(
'num1' => 4,
'title' => 'foo3',
),
3 => array(
'num1' => 3,
'title' => 'foo4',
),
4 => array(
'num1' => 3,
'num2' => 5,
'title' => 'foo5',
),
5 => array(
'num1' => 3,
'num2' => 1,
'title' => 'foo6',
),
6 => array(
'num1' => 3,
'num2' => 10,
'title' => 'foo7',
),
7 => array(
'num1' => 5,
'title' => 'foo8',
),
8 => array(
'num1' => 8,
'title' => 'foo9',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': init mapper, adding records'
);
// operator =
$result = $this->getResult($cx->find(array('title = ?', 'foo7')));
$expected = array(
0 => array(
'num1' => 3,
'num2' => 10,
'title' => 'foo7',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': operator check: ='
);
// operator >
$result = $this->getResult($cx->find(array('num1 > ?', 4)));
$expected = array(
0 => array(
'num1' => 5,
'title' => 'foo8',
),
1 => array(
'num1' => 8,
'title' => 'foo9',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': operator check: >'
);
// operator >=
$result = $this->getResult($cx->find(array('num1 >= ?', 5)));
$test->expect(
json_encode($result) == json_encode($expected),
$type.': operator check: >='
);
// operator <
$result = $this->getResult($cx->find(array('num2 < ?', 2)));
$expected = array(
0 => array(
'num1' => 3,
'num2' => 1,
'title' => 'foo6',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': operator check: <'
);
// operator <=
$result = $this->getResult($cx->find(array('num2 <= ?', 1)));
$test->expect(
json_encode($result) == json_encode($expected),
$type.': operator check: <='
);
// operator without binding
$result = $this->getResult($cx->find(array('num1 > 4')));
$expected = array(
0 => array(
'num1' => 5,
'title' => 'foo8',
),
1 => array(
'num1' => 8,
'title' => 'foo9',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': operator without binding'
);
// field comparision
$result = $this->getResult($cx->find(
array('num2 > num1', 1)));
$expected = array(
0 => array(
'num1' => 3,
'num2' => 5,
'title' => 'foo5',
),
1 => array(
'num1' => 3,
'num2' => 10,
'title' => 'foo7',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': check field comparision'
);
// lookahead search
$result = $this->getResult($cx->find(array('title like ?', '%o6')));
$expected = array(
0 => array(
'num1' => 3,
'num2' => 1,
'title' => 'foo6',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': lookahead search'
);
// lookbehind search
$result = $this->getResult($cx->find(array('title like ?', 'bar%')));
$expected = array(
0 => array(
'title' => 'bar1',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': lookbehind search'
);
// full search
$result = $this->getResult($cx->find(array('title like ?', '%a%')));
$expected = array(
0 => array(
'title' => 'bar1',
),
1 => array(
'num1' => 1,
'title' => 'baz2',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': full search'
);
// negated search
$result = $this->getResult($cx->find(array('title not like ?', 'foo%')));
$test->expect(
json_encode($result) == json_encode($expected),
$type.': negated search'
);
// AND / OR chaining
$result = $this->getResult($cx->find(
array('(num2 < ? AND num1 > ?) OR title like ?', 2, 1, '%o9')));
$expected = array(
0 => array(
'num1' => 3,
'num2' => 1,
'title' => 'foo6',
),
1 => array(
'num1' => 8,
'title' => 'foo9',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': check logical operator chaining'
);
// check limit
$result = $this->getResult($cx->find(
null, array('limit' => '2')));
$expected = array(
0 => array(
'title' => 'bar1',
),
1 => array(
'num1' => 1,
'title' => 'baz2',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': check limit'
);
// check order
$result = $this->getResult($cx->find(
array('num2 >= ?', 1), array('order' => 'num2 desc')));
$expected = array(
0 => array(
'num1' => 3,
'num2' => 10,
'title' => 'foo7',
),
1 => array(
'num1' => 3,
'num2' => 5,
'title' => 'foo5',
),
2 => array(
'num1' => 3,
'num2' => 1,
'title' => 'foo6',
),
);
$test->expect(
json_encode($result) == json_encode($expected),
$type.': check order'
);
// IN search
$rc = $cx->find(array('num1 IN ?',array(4,5,8)));
$result = $rc->getAll('title');
sort($result);
$test->expect(
json_encode($result) == json_encode(array('foo3','foo8','foo9')),
$type.': IN operator'
);
$rc = $cx->find(array('num1 IN ? && num2 > ? && num2 NOT IN ?',array(3,4),1,array(10)));
$result = $rc->getAll('title');
$test->expect(
json_encode($result) == json_encode(array('foo5')),
$type.': enhanced IN, NOT IN operator'
);
///////////////////////////////////
return $test->results();
}
/**
* unify results for better comparison
*/
private function getResult($result)
{
$out = array();
foreach ($result as $row) {
$row = $row->cast();
unset($row['_id']);
unset($row['id']);
ksort($row);
foreach ($row as $col => $val) {
if (empty($val) || is_null($val))
unset($row[$col]);
}
$out[] = $row;
}
return $out;
}
}