From 382664ff6de1ff33945d82f495271c0bb9a390a0 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Tue, 13 Mar 2012 14:57:01 -0400 Subject: [PATCH] Added order_by method to query builder --- sys/db/query_builder.php | 47 ++++++++++++++++++++++++++++---- tests/databases/firebird-qb.php | 28 +++++++++++++++---- tests/databases/sqlite-qb.php | 14 ++++++++++ tests/test_dbs/FB_TEST_DB.FDB | Bin 802816 -> 802816 bytes 4 files changed, 77 insertions(+), 12 deletions(-) diff --git a/sys/db/query_builder.php b/sys/db/query_builder.php index ff8a286..f424d41 100644 --- a/sys/db/query_builder.php +++ b/sys/db/query_builder.php @@ -15,21 +15,34 @@ /** * Convienience class for creating sql queries - also the class that * instantiates the specific db driver + * + * @todo Implement query queue to better match user meaning on queries */ class Query_Builder { - private $sql, - $select_string, + // Compiled query component strings + private $select_string, $from_string, - $where_array, $where_string, + $like_string, $insert_string, $update_string, + $set_string, + $order_string; + + // Key value pairs + private $where_array, + $like_array, $set_array, $set_array_keys, - $set_string, - $limit, + $order_array; + + // Query-global components + private $limit, $offset; + + // Alias to $this->db->sql + private $sql; /** * Constructor @@ -330,7 +343,23 @@ class Query_Builder { */ public function order_by($field, $type="") { - // @todo implement order_by method + // @todo Implement Order by Random + + // Set fields for later manipulation + $field = $this->db->quote_ident($field); + $this->order_array[$field] = $type; + + $order_clauses = array(); + + // Flatten key/val pairs into an array of space-separated pairs + foreach($this->order_array as $k => $v) + { + $order_clauses[] = $k . ' ' . strtoupper($v); + } + + // Set the final string + $this->order_string = ' ORDER BY '.implode(',', $order_clauses); + return $this; } @@ -586,6 +615,12 @@ class Query_Builder { $sql .= $this->where_string; } + // Set the order_by string + if ( ! empty($this->order_string)) + { + $sql .= $this->order_string; + } + // Set the limit via the class variables if (isset($this->limit) && is_numeric($this->limit)) { diff --git a/tests/databases/firebird-qb.php b/tests/databases/firebird-qb.php index fd543ce..71fd46b 100644 --- a/tests/databases/firebird-qb.php +++ b/tests/databases/firebird-qb.php @@ -35,28 +35,28 @@ class FirebirdQBTest extends UnitTestCase { echo '
Firebird Queries
'; } - function TestQBGet() + function TestGet() { $query = $this->qb->get('create_test'); $this->assertTrue(is_resource($query)); } - function TestQBGetLimit() + function TestGetLimit() { $query = $this->qb->get('create_test', 2); $this->assertTrue(is_resource($query)); } - function TestQBGetLimitSkip() + function TestGetLimitSkip() { $query = $this->qb->get('create_test', 2, 1); $this->assertTrue(is_resource($query)); } - function TestQBSelectWhereGet() + function TestSelectWhereGet() { $query = $this->qb->select('id, key as k, val') ->where('id >', 1) @@ -66,7 +66,7 @@ class FirebirdQBTest extends UnitTestCase { $this->assertTrue(is_resource($query)); } - function TestQBSelectWhereGet2() + function TestSelectWhereGet2() { $query = $this->qb->select('id, key as k, val') ->where(' id ', 1) @@ -77,7 +77,7 @@ class FirebirdQBTest extends UnitTestCase { } - function TestQBSelectGet() + function TestSelectGet() { $query = $this->qb->select('id, key as k, val') ->get('create_test', 2, 1); @@ -106,6 +106,20 @@ class FirebirdQBTest extends UnitTestCase { $this->assertTrue(is_resource($query)); } + function TestOrderBy() + { + $query = $this->qb->select('id, key as k, val') + ->from('create_test') + ->where('id >', 0) + ->where('id <', 9000) + ->order_by('id', 'DESC') + ->order_by('k', 'ASC') + ->limit(5,2) + ->get(); + + $this->assertTrue(is_resource($query)); + } + function TestInsert() { $query = $this->qb->set('id', 4) @@ -133,4 +147,6 @@ class FirebirdQBTest extends UnitTestCase { $this->assertTrue($query); } + + } \ No newline at end of file diff --git a/tests/databases/sqlite-qb.php b/tests/databases/sqlite-qb.php index 3a6e7f3..73497ce 100644 --- a/tests/databases/sqlite-qb.php +++ b/tests/databases/sqlite-qb.php @@ -100,6 +100,20 @@ $this->assertIsA($query, 'PDOStatement'); } + function TestOrderBy() + { + $query = $this->qb->select('id, key as k, val') + ->from('create_test') + ->where('id >', 0) + ->where('id <', 9000) + ->order_by('id', 'DESC') + ->order_by('k', 'ASC') + ->limit(5,2) + ->get(); + + $this->assertIsA($query, 'PDOStatement'); + } + function TestInsert() { $query = $this->qb->set('id', 4) diff --git a/tests/test_dbs/FB_TEST_DB.FDB b/tests/test_dbs/FB_TEST_DB.FDB index b176515eb0e82b6130e385fb4ca101cd2ceaa70c..ee58f375983a8849f44d16d54eb50e8735d297fc 100755 GIT binary patch delta 2092 zcmb7FOGs2v82;~_8Rv0NZBTd;m=2-dBL$?H}qVlQMvUiM?L{1AoWtCmZ`GE3ZP(Sz@BrvY<9Dmq#H}zVn8`J{0b1mM~*o+*EH(p z2PkG>- zd0vvTKOjY8Ek$D~rM0~?Af?l0-I--c!5K?Sc~z3ZC3V1Vo4x;OIqX-8Br76ZuM)LO ziTYB9qIM`zzWQtnh|*Y#(pZWD$Oc4Zmt7y6v9zea>eF0apC*5O8l)8FZX{Lg(!7;C zlsBQZeY0PVu~^ht%7IrJOF0zk%H#lIUZb{kXrNqIVhqJ_CCc?>@(|A71i0HmYN9T; z-|^Yc?k`xi<_5p-wUVqk9byx6)_O^GZGfuAit1~PHPz|>)oS5*TdQY}^q zQ`_Z|xBZqTgO;w$^Ye%AUhV?#w}m}U^-F$0{b^!H+U((0vL-zE24fy(NG2;wT-JV@Gk^W>XGv8fVKgiIt20$)h52Mlk}XhDO{y?k$_;T1YDTR?K+IzAsp5 z^M*We`d;|cnEXFg7AzCbR^*H0x>Cd0;Jay!r8Wv0OSK*OtFo%qul>o9S7~=$k^V(z zM8u5bbXoe?S7y?`I9)8`H0o+BIRR*_IKg?z$(Uv58psxNL=h-6WmpmTFH>@51OPOa z1kSn|YXWB^fkti$H&-@c3hp;w;S5zc7+lJv)5|fbUvbo1L1S%_#+u^^#qk|-#A5k5 z0_1%hv6y0U75mgi5XU55WBlw-iDObblAJ@0sWl S_srcaiLndw)|y9ILVp81Fg^$X delta 2179 zcmcIlU1(ER9RHtllQ#CACC642(Yln>Htp(~v~Q`O3YC?c+|kIr-)MzkdIZ zd#crJwVK^S;G0ac9fHN(s$-DcpL2j$_yACH`6a-jV&k9xetwTrbmhJL5*)6%I%% zW<_uxA?@%}ya(PSl5h+6@Vb{s!6kf(i9Yxa_hh1Ha_`3Vr{Z7Kr5@q02oQ{4?CfGm znjI3EG~2}Sue|?Kky5gvkYXFw&m!Hxe-z~TcuDXjcO8Af#g=}S68pEZujn%_#`{^P zaQj&M_oc$LRHFFkJ)3)qn$|U`)WBi~C8UhS)Zj%UFD;NtWq6T`|B@^z`g>SMr?DH; zdoG3{jc=PMl@Ad>IZ3N~cNq`WA}VNUS4X4wy#Fs3S9@4@dp2hTp^@G^7e9Q>_Rt#c zQPw#&Z971UQ)#qRC~0~D%{dcxOod$oi(3sXi(3qS*hKT8rkQDQ1~ElJds&GzY9Z;( zVkE`lVn>>FNOyVvJ{ODc-K1#S$~v5S*`~ONM_H=%f#UN(ym{+()4S+5%?5Xs3aHsw zxqq4{S*$99vKFs3l&)*9Ej6^C9lE&WZgNQ!4i+nD`)@q!!kqrKYEB{du{nT0O#rfM z<(b8*bq>L>#j174vTv~taKX72Zk;u{5lj|I&^iDpC$pGd2p1YXqI;%2OYi#0!ylUF zz&uI^&8AyO`-p1kAwz!Vca!)zWq(d5{x_3}8T`{n1+`Rn#YRYTCa#1t5t$|y>mlM` zv5XdV>*p#Hs4KX*-^+%Z<_Fu$&d;)sA~Fe4nFKBd(`>WqCHPg-r8P%fc6c1>*H{#Vh)u^`t3KLWg2V_(6e22#VB6SPGVe?mI&Q-%a`16AfkSb;`$0xqe)= zT$luDA^h^LG|(bov8EMZRW8)D=ZaSG@a(bh1e!E|UZ5JF+-lrRMhrI}xxrDxZC