Skip to content

Commit 6b9a9fc

Browse files
committed
add Replace and Trim function expressions
1 parent fdd3125 commit 6b9a9fc

7 files changed

Lines changed: 298 additions & 15 deletions

File tree

composer.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,10 @@
2020
"psr-4": {
2121
"Packaged\\QueryBuilder\\": "src"
2222
}
23+
},
24+
"autoload-dev": {
25+
"psr-4": {
26+
"Packaged\\Tests\\QueryBuilder\\": "tests"
27+
}
2328
}
2429
}

phpunit.xml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,4 @@
1515
<directory>tests</directory>
1616
</testsuite>
1717
</testsuites>
18-
<filter>
19-
<whitelist>
20-
<directory suffix=".php">src</directory>
21-
</whitelist>
22-
<blacklist>
23-
<directory suffix=".php">vendor</directory>
24-
<directory suffix=".php">tests</directory>
25-
</blacklist>
26-
</filter>
2718
</phpunit>

src/Assembler/Segments/SelectExpressionAssembler.php

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
use Packaged\QueryBuilder\SelectExpression\FunctionSelectExpression;
1212
use Packaged\QueryBuilder\SelectExpression\ISelectExpression;
1313
use Packaged\QueryBuilder\SelectExpression\NowSelectExpression;
14+
use Packaged\QueryBuilder\SelectExpression\ReplaceSelectExpression;
1415
use Packaged\QueryBuilder\SelectExpression\SubQuerySelectExpression;
1516
use Packaged\QueryBuilder\SelectExpression\SubStringSelectExpression;
1617
use Packaged\QueryBuilder\SelectExpression\TableSelectExpression;
18+
use Packaged\QueryBuilder\SelectExpression\TrimSelectExpression;
1719

1820
class SelectExpressionAssembler extends AbstractSegmentAssembler
1921
{
@@ -50,6 +52,14 @@ public function assemble()
5052
{
5153
return $this->assembleSubStringSelectExpression($this->_segment);
5254
}
55+
else if($this->_segment instanceof TrimSelectExpression)
56+
{
57+
return $this->assembleTrimSelectExpression($this->_segment);
58+
}
59+
else if($this->_segment instanceof ReplaceSelectExpression)
60+
{
61+
return $this->assembleReplaceSelectExpression($this->_segment);
62+
}
5363
else if($this->_segment instanceof FormatSelectExpression)
5464
{
5565
return $this->assembleFormatSelectExpression($this->_segment);
@@ -181,11 +191,48 @@ public function assembleSubStringSelectExpression(
181191
)
182192
{
183193
return $expr->getFunctionName()
184-
. '('
185-
. $this->getAssembler()->assembleSegment($expr->getField())
186-
. ',' . $expr->getStartPosition()
187-
. ($expr->hasLength() ? ',' . $expr->getLength() : '')
188-
. ')'
189-
. ($expr->hasAlias() ? ' AS ' . $this->escapeField($expr->getAlias()) : '');
194+
. '('
195+
. $this->getAssembler()->assembleSegment($expr->getField())
196+
. ',' . $expr->getStartPosition()
197+
. ($expr->hasLength() ? ',' . $expr->getLength() : '')
198+
. ')'
199+
. ($expr->hasAlias() ? ' AS ' . $this->escapeField($expr->getAlias()) : '');
200+
}
201+
202+
public function assembleTrimSelectExpression(TrimSelectExpression $expr)
203+
{
204+
$build = [];
205+
if($expr->hasSide())
206+
{
207+
$build[] = $expr->getSide();
208+
}
209+
if($expr->hasString())
210+
{
211+
$build[] = $this->getAssembler()->assembleSegment($expr->getString());
212+
}
213+
if($expr->hasSide() || $expr->hasString())
214+
{
215+
$build[] = 'FROM';
216+
}
217+
$build[] = $this->getAssembler()->assembleSegment($expr->getField());
218+
219+
return sprintf(
220+
'%s(%s)%s',
221+
$expr->getFunctionName(),
222+
implode(' ', $build),
223+
$expr->hasAlias() ? ' AS ' . $this->escapeField($expr->getAlias()) : ''
224+
);
225+
}
226+
227+
public function assembleReplaceSelectExpression(ReplaceSelectExpression $expr)
228+
{
229+
return sprintf(
230+
'%s(%s,%s,%s)%s',
231+
$expr->getFunctionName(),
232+
$this->getAssembler()->assembleSegment($expr->getField()),
233+
$this->getAssembler()->assembleSegment($expr->getSearchString()),
234+
$this->getAssembler()->assembleSegment($expr->getReplaceString()),
235+
$expr->hasAlias() ? ' AS ' . $this->escapeField($expr->getAlias()) : ''
236+
);
190237
}
191238
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
namespace Packaged\QueryBuilder\SelectExpression;
3+
4+
use Packaged\QueryBuilder\Expression\IExpression;
5+
use Packaged\QueryBuilder\Expression\StringExpression;
6+
7+
class ReplaceSelectExpression extends FunctionSelectExpression
8+
{
9+
protected $_searchString = null;
10+
protected $_replaceString = null;
11+
12+
public function setSearchString($string)
13+
{
14+
$this->_searchString = $string;
15+
return $this;
16+
}
17+
18+
public function getSearchString()
19+
{
20+
return $this->_searchString instanceof IExpression
21+
? $this->_searchString : StringExpression::create($this->_searchString);
22+
}
23+
24+
public function setReplaceString($side)
25+
{
26+
$this->_replaceString = $side;
27+
return $this;
28+
}
29+
30+
public function getReplaceString()
31+
{
32+
return $this->_replaceString instanceof IExpression
33+
? $this->_replaceString : StringExpression::create($this->_replaceString);
34+
}
35+
36+
/**
37+
* Aggregate function name e.g. SUM
38+
*
39+
* @return string
40+
*/
41+
public function getFunctionName()
42+
{
43+
return 'REPLACE';
44+
}
45+
46+
public static function create(
47+
$field, $search = null, $replace = null, $alias = null
48+
)
49+
{
50+
$expression = parent::createWithAlias($field, $alias);
51+
/**
52+
* @var $expression static
53+
*/
54+
$expression->setSearchString($search);
55+
$expression->setReplaceString($replace);
56+
return $expression;
57+
}
58+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
namespace Packaged\QueryBuilder\SelectExpression;
3+
4+
use Packaged\QueryBuilder\Expression\IExpression;
5+
use Packaged\QueryBuilder\Expression\StringExpression;
6+
7+
class TrimSelectExpression extends FunctionSelectExpression
8+
{
9+
protected $_string = null;
10+
protected $_side = null;
11+
12+
public function setString($string)
13+
{
14+
$this->_string = $string;
15+
return $this;
16+
}
17+
18+
public function getString()
19+
{
20+
return $this->_string instanceof IExpression
21+
? $this->_string : StringExpression::create($this->_string);
22+
}
23+
24+
public function hasString()
25+
{
26+
return $this->_string !== null;
27+
}
28+
29+
public function setSide($side)
30+
{
31+
$side = strtoupper($side);
32+
if(in_array($side, ['LEADING', 'TRAILING', 'BOTH']))
33+
{
34+
$this->_side = $side;
35+
}
36+
return $this;
37+
}
38+
39+
public function getSide()
40+
{
41+
return $this->_side;
42+
}
43+
44+
public function hasSide()
45+
{
46+
return $this->_side !== null;
47+
}
48+
49+
/**
50+
* Aggregate function name e.g. SUM
51+
*
52+
* @return string
53+
*/
54+
public function getFunctionName()
55+
{
56+
return 'TRIM';
57+
}
58+
59+
public static function create(
60+
$field, $string = null, $side = null, $alias = null
61+
)
62+
{
63+
$expression = parent::createWithAlias($field, $alias);
64+
/**
65+
* @var $expression static
66+
*/
67+
$expression->setString($string);
68+
$expression->setSide($side);
69+
return $expression;
70+
}
71+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
namespace Packaged\Tests\QueryBuilder\SelectExpression;
3+
4+
use Packaged\QueryBuilder\Assembler\QueryAssembler;
5+
use Packaged\QueryBuilder\SelectExpression\ReplaceSelectExpression;
6+
7+
class ReplaceSelectExpressionTest extends \PHPUnit_Framework_TestCase
8+
{
9+
public function testAssemble()
10+
{
11+
$selector = new ReplaceSelectExpression();
12+
$selector->setField('fieldname');
13+
$this->assertEquals(
14+
'REPLACE(fieldname,"","")',
15+
QueryAssembler::stringify($selector)
16+
);
17+
$selector->setAlias('new');
18+
$this->assertEquals(
19+
'REPLACE(fieldname,"","") AS new',
20+
QueryAssembler::stringify($selector)
21+
);
22+
$selector->setSearchString('~');
23+
$this->assertEquals(
24+
'REPLACE(fieldname,"~","") AS new',
25+
QueryAssembler::stringify($selector)
26+
);
27+
$selector->setReplaceString('-');
28+
$this->assertEquals(
29+
'REPLACE(fieldname,"~","-") AS new',
30+
QueryAssembler::stringify($selector)
31+
);
32+
}
33+
34+
public function testStatics()
35+
{
36+
$this->assertEquals(
37+
'REPLACE(fieldname,"","")',
38+
QueryAssembler::stringify(ReplaceSelectExpression::create('fieldname'))
39+
);
40+
$this->assertEquals(
41+
'REPLACE(fieldname,"","") AS new',
42+
QueryAssembler::stringify(ReplaceSelectExpression::createWithAlias('fieldname', 'new'))
43+
);
44+
$this->assertEquals(
45+
'REPLACE(fieldname,"~","") AS new',
46+
QueryAssembler::stringify(ReplaceSelectExpression::create('fieldname', '~', null, 'new'))
47+
);
48+
$this->assertEquals(
49+
'REPLACE(fieldname,"~","-") AS new',
50+
QueryAssembler::stringify(ReplaceSelectExpression::create('fieldname', '~', '-', 'new'))
51+
);
52+
}
53+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
namespace Packaged\Tests\QueryBuilder\SelectExpression;
3+
4+
use Packaged\QueryBuilder\Assembler\QueryAssembler;
5+
use Packaged\QueryBuilder\SelectExpression\TrimSelectExpression;
6+
7+
class TrimSelectExpressionTest extends \PHPUnit_Framework_TestCase
8+
{
9+
public function testAssemble()
10+
{
11+
$selector = new TrimSelectExpression();
12+
$selector->setField('fieldname');
13+
$this->assertEquals(
14+
'TRIM(fieldname)',
15+
QueryAssembler::stringify($selector)
16+
);
17+
$selector->setAlias('new');
18+
$this->assertEquals(
19+
'TRIM(fieldname) AS new',
20+
QueryAssembler::stringify($selector)
21+
);
22+
$selector->setString('~');
23+
$this->assertEquals(
24+
'TRIM("~" FROM fieldname) AS new',
25+
QueryAssembler::stringify($selector)
26+
);
27+
$selector->setSide('unknown');
28+
$this->assertEquals(
29+
'TRIM("~" FROM fieldname) AS new',
30+
QueryAssembler::stringify($selector)
31+
);
32+
$selector->setSide('trailing');
33+
$this->assertEquals(
34+
'TRIM(TRAILING "~" FROM fieldname) AS new',
35+
QueryAssembler::stringify($selector)
36+
);
37+
}
38+
39+
public function testStatics()
40+
{
41+
$this->assertEquals(
42+
'TRIM(fieldname)',
43+
QueryAssembler::stringify(TrimSelectExpression::create('fieldname'))
44+
);
45+
$this->assertEquals(
46+
'TRIM(fieldname) AS new',
47+
QueryAssembler::stringify(TrimSelectExpression::createWithAlias('fieldname', 'new'))
48+
);
49+
$this->assertEquals(
50+
'TRIM("~" FROM fieldname) AS new',
51+
QueryAssembler::stringify(TrimSelectExpression::create('fieldname', '~', null, 'new'))
52+
);
53+
$this->assertEquals(
54+
'TRIM(LEADING "~" FROM fieldname) AS new',
55+
QueryAssembler::stringify(TrimSelectExpression::create('fieldname', '~', 'leading', 'new'))
56+
);
57+
}
58+
}

0 commit comments

Comments
 (0)