Skip to content

Commit 36b50bc

Browse files
committed
Merge pull request #71 from AlexeyDsov/noBrakesExpressions
Added option noBrackets for binary/unary expressions
2 parents efba9a7 + 18c6aa1 commit 36b50bc

File tree

7 files changed

+132
-19
lines changed

7 files changed

+132
-19
lines changed

core/Logic/BinaryExpression.class.php

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ final class BinaryExpression implements LogicalObject, MappableObject
4343
private $left = null;
4444
private $right = null;
4545
private $logic = null;
46+
private $brackets = true;
47+
48+
/**
49+
* @return BinaryExpression
50+
*/
51+
public static function create($left, $right, $logic)
52+
{
53+
return new self($left, $right, $logic);
54+
}
4655

4756
public function __construct($left, $right, $logic)
4857
{
@@ -66,30 +75,41 @@ public function getLogic()
6675
return $this->logic;
6776
}
6877

78+
/**
79+
* @param boolean $noBrackets
80+
* @return BinaryExpression
81+
*/
82+
public function noBrackets($noBrackets = true)
83+
{
84+
$this->brackets = !$noBrackets;
85+
return $this;
86+
}
87+
6988
public function toDialectString(Dialect $dialect)
7089
{
71-
return
72-
'('
73-
.$dialect->toFieldString($this->left)
90+
$sql = $dialect->toFieldString($this->left)
7491
.' '.$dialect->logicToString($this->logic).' '
75-
.$dialect->toValueString($this->right)
76-
.')';
92+
.$dialect->toValueString($this->right);
93+
return $this->brackets ? "({$sql})" : $sql;
7794
}
7895

7996
/**
8097
* @return BinaryExpression
8198
**/
8299
public function toMapped(ProtoDAO $dao, JoinCapableQuery $query)
83100
{
84-
return new self(
101+
$expression = new self(
85102
$dao->guessAtom($this->left, $query),
86103
$dao->guessAtom($this->right, $query),
87104
$this->logic
88105
);
106+
107+
return $expression->noBrackets(!$this->brackets);
89108
}
90109

91110
public function toBoolean(Form $form)
92111
{
112+
Assert::isTrue($this->brackets, 'brackets must be enabled');
93113
$left = $form->toFormValue($this->left);
94114
$right = $form->toFormValue($this->right);
95115

core/Logic/PostfixUnaryExpression.class.php

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,55 @@ final class PostfixUnaryExpression implements LogicalObject, MappableObject
2222

2323
private $subject = null;
2424
private $logic = null;
25+
private $brackets = true;
26+
27+
/**
28+
* @return PostfixUnaryExpression
29+
*/
30+
public static function create($subject, $logic)
31+
{
32+
return new self($subject, $logic);
33+
}
2534

2635
public function __construct($subject, $logic)
2736
{
2837
$this->subject = $subject;
2938
$this->logic = $logic;
3039
}
3140

41+
/**
42+
* @param boolean $noBrackets
43+
* @return PostfixUnaryExpression
44+
*/
45+
public function noBrackets($noBrackets = true)
46+
{
47+
$this->brackets = !$noBrackets;
48+
return $this;
49+
}
50+
3251
public function toDialectString(Dialect $dialect)
3352
{
34-
return
35-
'('
36-
.$dialect->toFieldString($this->subject)
37-
.' '.$dialect->logicToString($this->logic)
38-
.')';
53+
$sql = $dialect->toFieldString($this->subject)
54+
.' '.$dialect->logicToString($this->logic);
55+
return $this->brackets ? "({$sql})" : $sql;
3956
}
4057

4158
/**
4259
* @return PostfixUnaryExpression
4360
**/
4461
public function toMapped(ProtoDAO $dao, JoinCapableQuery $query)
4562
{
46-
return new self(
63+
$expression = new self(
4764
$dao->guessAtom($this->subject, $query),
4865
$this->logic
4966
);
67+
68+
return $expression->noBrackets(!$this->brackets);
5069
}
5170

5271
public function toBoolean(Form $form)
5372
{
73+
Assert::isTrue($this->brackets, 'brackets must be enabled');
5474
$subject = $form->toFormValue($this->subject);
5575

5676
switch ($this->logic) {

core/Logic/PrefixUnaryExpression.class.php

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,55 @@ final class PrefixUnaryExpression implements LogicalObject, MappableObject
1919

2020
private $subject = null;
2121
private $logic = null;
22+
private $brackets = true;
23+
24+
/**
25+
* @return PrefixUnaryExpression
26+
*/
27+
public static function create($subject, $logic)
28+
{
29+
return new self($subject, $logic);
30+
}
2231

2332
public function __construct($logic, $subject)
2433
{
2534
$this->subject = $subject;
2635
$this->logic = $logic;
2736
}
2837

38+
/**
39+
* @param boolean $noBrackets
40+
* @return PrefixUnaryExpression
41+
*/
42+
public function noBrackets($noBrackets = true)
43+
{
44+
$this->brackets = !$noBrackets;
45+
return $this;
46+
}
47+
2948
public function toDialectString(Dialect $dialect)
3049
{
31-
return
32-
'('
33-
.$dialect->logicToString($this->logic)
34-
.' '.$dialect->toFieldString($this->subject)
35-
.')';
50+
$sql = $dialect->logicToString($this->logic)
51+
.' '.$dialect->toFieldString($this->subject);
52+
53+
return $this->brackets ? "({$sql})" : $sql;
3654
}
3755

3856
/**
3957
* @return PrefixUnaryExpression
4058
**/
4159
public function toMapped(ProtoDAO $dao, JoinCapableQuery $query)
4260
{
43-
return new self(
61+
$expression = new self(
4462
$this->logic,
4563
$dao->guessAtom($this->subject, $query)
4664
);
65+
return $expression->noBrackets($this->brackets);
4766
}
4867

4968
public function toBoolean(Form $form)
5069
{
70+
Assert::isTrue($this->brackets, 'brackets must be enabled');
5171
$subject = $form->toFormValue($this->subject);
5272

5373
switch ($this->logic) {

core/OSQL/SQLFunction.class.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ public function toMapped(ProtoDAO $dao, JoinCapableQuery $query)
113113
$sqlFunction = call_user_func_array(array('self', 'create'), $mapped);
114114

115115
$sqlFunction->aggregate = $this->aggregate;
116+
$sqlFunction->alias = $this->alias;
116117

117118
$sqlFunction->castTo($this->cast);
118119

doc/ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
2012-03-26 Alexey S. Denisov
2+
* core/Logic/BinaryExpression.class.php,
3+
core/Logic/PostfixUnaryExpression.class.php,
4+
core/Logic/PrefixUnaryExpression.class.php,
5+
core/OSQL/SQLFunction.class.php: Added option noBrackets for binary/unary expressions
6+
17
2012-04-27 Georgiy T. Kutsurua
28

39
* core/Form/Primitives/PrimitiveString.class.php:

test/main/CriteriaTest.class.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,39 @@ public function testDialectStringObjects()
214214
);
215215
}
216216

217+
public function testSqlFunction()
218+
{
219+
$criteria = Criteria::create(TestCity::dao())->
220+
addProjection(
221+
Projection::property(
222+
SQLFunction::create(
223+
'count',
224+
SQLFunction::create(
225+
'substring',
226+
BinaryExpression::create(
227+
'name',
228+
BinaryExpression::create(
229+
DBValue::create('M....w'),
230+
DBValue::create('#'),
231+
'for'
232+
)->
233+
noBrackets(),
234+
'from'
235+
)->
236+
noBrackets()
237+
)
238+
)->
239+
setAggregateDistinct()->
240+
setAlias('my_alias')
241+
)
242+
);
243+
244+
$this->assertEquals(
245+
$criteria->toDialectString(PostgresDialect::me()),
246+
'SELECT count(DISTINCT substring("custom_table"."name" from \'M....w\' for \'#\')) AS "my_alias" FROM "custom_table"'
247+
);
248+
}
249+
217250
public function testSleepWithEmptyDao()
218251
{
219252
$baseCriteria =

test/main/OsqlSelectTest.class.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,19 @@ public function testSelectGet()
1616
SQLFunction::create(
1717
'count', DBField::create('field5', 'test_table')
1818
)->
19+
setAggregateDistinct()->
1920
setAlias('alias5')
21+
)->
22+
get(
23+
SQLFunction::create(
24+
'substring',
25+
BinaryExpression::create(
26+
DBField::create('field6', 'test_table'),
27+
DBValue::create('a..b'),
28+
'from'
29+
)->
30+
noBrackets()
31+
)
2032
);
2133

2234
$this->assertEquals(
@@ -26,7 +38,8 @@ public function testSelectGet()
2638
.'"test_table"."field2", '
2739
.'"test_table"."field3" AS "alias3", '
2840
.'"test_table"."field4", '
29-
.'count("test_table"."field5") AS "alias5" '
41+
.'count(DISTINCT "test_table"."field5") AS "alias5", '
42+
.'substring("test_table"."field6" from \'a..b\') '
3043
.'FROM "test_table"'
3144
);
3245
}

0 commit comments

Comments
 (0)