From a1f01a4f872f405466a606c7072b7ebb2780f48c Mon Sep 17 00:00:00 2001 From: Sergey Tsalkov Date: Fri, 23 Sep 2011 22:03:15 -0700 Subject: [PATCH] few more fixes and tests for WhereClause --- db.class.php | 8 +++++++- simpletest/WhereClauseTest.php | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/db.class.php b/db.class.php index 978b781..254a135 100644 --- a/db.class.php +++ b/db.class.php @@ -614,7 +614,13 @@ class WhereClause { function negateLast() { $i = count($this->clauses) - 1; - $this->clauses[$i] = 'NOT (' . $this->clauses[$i] . ')'; + if (!isset($this->clauses[$i])) return; + + if ($this->clauses[$i] instanceof WhereClause) { + $this->clauses[$i]->negate(); + } else { + $this->clauses[$i] = 'NOT (' . $this->clauses[$i] . ')'; + } } function negate() { diff --git a/simpletest/WhereClauseTest.php b/simpletest/WhereClauseTest.php index c3169da..e9e2380 100644 --- a/simpletest/WhereClauseTest.php +++ b/simpletest/WhereClauseTest.php @@ -22,6 +22,42 @@ class WhereClauseTest extends SimpleTest { $this->assert($result[0]['age'] === '15'); } + function test_3_negate_last() { + $where = new WhereClause('and'); + $where->add('password=%s', 'hello'); + $subclause = $where->addClause('or'); + $subclause->add('username!=%s', 'Bart'); + $subclause->negateLast(); + + $result = DB::query("SELECT * FROM accounts WHERE %l", $where->text()); + $this->assert(count($result) === 1); + $this->assert($result[0]['age'] === '15'); + } + + function test_4_negate_last_query() { + $where = new WhereClause('and'); + $where->add('password=%s', 'hello'); + $subclause = $where->addClause('or'); + $subclause->add('username!=%s', 'Bart'); + $where->negateLast(); + + $result = DB::query("SELECT * FROM accounts WHERE %l", $where->text()); + $this->assert(count($result) === 1); + $this->assert($result[0]['age'] === '15'); + } + + function test_5_negate() { + $where = new WhereClause('and'); + $where->add('password=%s', 'hello'); + $subclause = $where->addClause('or'); + $subclause->add('username!=%s', 'Bart'); + $subclause->negate(); + + $result = DB::query("SELECT * FROM accounts WHERE %l", $where->text()); + $this->assert(count($result) === 1); + $this->assert($result[0]['age'] === '15'); + } + }