public function analyze()
{
// $a || $a
// ($a) && ($a)
$this->atomIs('Logical')->hasNoIn(array('LEFT', 'RIGHT'))->outIs('RIGHT')->outIsIE('CODE')->atomIsNot('Logical')->savePropertyAs('fullcode', 'left')->inIsIE('CODE')->inIs('RIGHT')->outIs('LEFT')->outIsIE('CODE')->atomIsNot('Logical')->samePropertyAs('fullcode', 'left', true)->back('first');
$this->prepareQuery();
// $a || $a || $a
// ($a) && ($a)
// two levels
$this->atomIs('Logical')->outIs('RIGHT')->outIsIE('CODE')->savePropertyAs('fullcode', 'right')->inIsIE('CODE')->inIs('RIGHT')->outIs('LEFT')->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->samePropertyAs('fullcode', 'right', true)->back('first');
$this->prepareQuery();
$this->atomIs('Logical')->outIs('LEFT')->outIsIE('CODE')->savePropertyAs('fullcode', 'left')->inIsIE('CODE')->inIs('LEFT')->outIs('RIGHT')->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->samePropertyAs('fullcode', 'left', true)->back('first');
$this->prepareQuery();
// case for $a || $b || $b
$this->atomIs('Logical')->outIs('RIGHT')->outIsIE('CODE')->atomIs('Logical')->outIs('RIGHT')->outIsIE('CODE')->savePropertyAs('fullcode', 'right')->inIsIE('CODE')->inIs('RIGHT')->outIs('LEFT')->outIsIE('CODE')->samePropertyAs('fullcode', 'right', true)->back('first');
$this->prepareQuery();
// $a || $a || $a
// ($a) && ($a)
// three levels
// straight structure
$this->atomIs('Logical')->outIs('RIGHT')->outIsIE('CODE')->savePropertyAs('fullcode', 'left')->inIsIE('CODE')->inIs('RIGHT')->outIs('LEFT')->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->samePropertyAs('fullcode', 'left', true)->back('first');
$this->prepareQuery();
// reverse structure
$this->atomIs('Logical')->outIs('LEFT')->outIsIE('CODE')->savePropertyAs('fullcode', 'left')->inIsIE('CODE')->inIs('LEFT')->outIs('RIGHT')->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->samePropertyAs('fullcode', 'left', true)->back('first');
$this->prepareQuery();
// $a || $a || $a
// ($a) && ($a)
// four levels
$this->atomIs('Logical')->outIs('LEFT')->outIsIE('CODE')->savePropertyAs('fullcode', 'left')->inIsIE('CODE')->inIs('LEFT')->outIs('RIGHT')->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->samePropertyAs('fullcode', 'left', true)->back('first');
$this->prepareQuery();
// $a || $a || $a
// ($a) && ($a)
// four levels
$this->atomIs('Logical')->outIs('LEFT')->outIsIE('CODE')->savePropertyAs('fullcode', 'left')->inIsIE('CODE')->inIs('LEFT')->outIs('RIGHT')->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->outIsIE('CODE')->atomIs('Logical')->outIs(array('RIGHT', 'LEFT'))->samePropertyAs('fullcode', 'left', true)->back('first');
$this->prepareQuery();
// TODO : also adding situations like ($a and !$a) ?
}