Skip to content

Commit 87d9a38

Browse files
committed
fix(QueryBuilder): Fix for using operators with dynamic where constraints
1 parent 00e8450 commit 87d9a38

8 files changed

Lines changed: 137 additions & 17 deletions

models/Query/QueryBuilder.cfc

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4639,8 +4639,14 @@ component displayname="QueryBuilder" accessors="true" {
46394639
*/
46404640
if ( !arrayIsEmpty( reMatchNoCase( "^where(.+)", missingMethodName ) ) ) {
46414641
var args = { "column": mid( missingMethodName, 6, len( missingMethodName ) - 5 ) };
4642-
for ( var key in missingMethodArguments ) {
4643-
args[ "operator" ] = missingMethodArguments[ key ];
4642+
var missingArgsNames = structKeyArray( missingMethodArguments );
4643+
for ( var i = 1; i <= missingArgsNames.len(); i++ ) {
4644+
var key = missingArgsNames[ i ];
4645+
if ( isNumeric( key ) ) {
4646+
args[ i + 1 ] = missingMethodArguments[ key ];
4647+
} else {
4648+
args[ key ] = missingMethodArguments[ key ];
4649+
}
46444650
}
46454651
return where( argumentCollection = args );
46464652
}
@@ -4652,10 +4658,15 @@ component displayname="QueryBuilder" accessors="true" {
46524658
*/
46534659
if ( !arrayIsEmpty( reMatchNoCase( "^andWhere(.+)", missingMethodName ) ) ) {
46544660
var args = { "column": mid( missingMethodName, 9, len( missingMethodName ) - 8 ) };
4655-
for ( var key in missingMethodArguments ) {
4656-
args[ "operator" ] = missingMethodArguments[ key ];
4661+
var missingArgsNames = structKeyArray( missingMethodArguments );
4662+
for ( var i = 1; i <= missingArgsNames.len(); i++ ) {
4663+
var key = missingArgsNames[ i ];
4664+
if ( isNumeric( key ) ) {
4665+
args[ i + 1 ] = missingMethodArguments[ key ];
4666+
} else {
4667+
args[ key ] = missingMethodArguments[ key ];
4668+
}
46574669
}
4658-
46594670
return andWhere( argumentCollection = args );
46604671
}
46614672

@@ -4666,10 +4677,15 @@ component displayname="QueryBuilder" accessors="true" {
46664677
*/
46674678
if ( !arrayIsEmpty( reMatchNoCase( "^orWhere(.+)", missingMethodName ) ) ) {
46684679
var args = { "column": mid( missingMethodName, 8, len( missingMethodName ) - 7 ) };
4669-
for ( var key in missingMethodArguments ) {
4670-
args[ "operator" ] = missingMethodArguments[ key ];
4680+
var missingArgsNames = structKeyArray( missingMethodArguments );
4681+
for ( var i = 1; i <= missingArgsNames.len(); i++ ) {
4682+
var key = missingArgsNames[ i ];
4683+
if ( isNumeric( key ) ) {
4684+
args[ i + 1 ] = missingMethodArguments[ key ];
4685+
} else {
4686+
args[ key ] = missingMethodArguments[ key ];
4687+
}
46714688
}
4672-
46734689
return orWhere( argumentCollection = args );
46744690
}
46754691

tests/resources/AbstractQueryBuilderSpec.cfc

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,42 @@ component extends="testbox.system.BaseSpec" {
9393
}, wrapColumnsAndAliases() );
9494
} );
9595

96-
it( "parses operators like > in dynamic whereColumns", function() {
96+
it( "handles dynamic whereColumns", function() {
9797
testCase( function( builder ) {
98-
builder.select( "ID").from( "users").whereID(">", 1 )
99-
}, parseOperatorsWithDynamicWhere() )
98+
builder
99+
.select( "ID" )
100+
.from( "users" )
101+
.whereID( 1 );
102+
}, dynamicWhere() );
103+
} );
104+
105+
it( "parses operators in dynamic whereColumns", function() {
106+
testCase( function( builder ) {
107+
builder
108+
.select( "ID" )
109+
.from( "users" )
110+
.whereID( ">", 1 );
111+
}, parseOperatorsWithDynamicWhere() );
112+
} );
113+
114+
it( "parses operators in dynamic andWhereColumns", function() {
115+
testCase( function( builder ) {
116+
builder
117+
.select( "ID" )
118+
.from( "users" )
119+
.whereID( ">", 1 )
120+
.andWhereID( "<", 10 );
121+
}, parseOperatorsWithDynamicAndWhere() );
122+
} );
123+
124+
it( "parses operators in dynamic orWhereColumns", function() {
125+
testCase( function( builder ) {
126+
builder
127+
.select( "ID" )
128+
.from( "users" )
129+
.whereID( ">", 1 )
130+
.orWhereID( "<", 0 );
131+
}, parseOperatorsWithDynamicOrWhere() );
100132
} );
101133

102134
it( "selects raw values correctly", function() {

tests/specs/Query/DerbyQueryBuilderSpec.cfc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,20 @@ component extends="tests.resources.AbstractQueryBuilderSpec" {
3636
return { "sql": "SELECT ""users"".""foo"" FROM ""users"" WHERE ""users"".""foo"" = ?", "bindings": [ "bar" ] };
3737
}
3838

39+
function dynamicWhere() {
40+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" = ?", "bindings": [ 1 ] };
41+
}
42+
3943
function parseOperatorsWithDynamicWhere() {
40-
return { "sql" : "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ?", "bindings": [ 1 ] }
44+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ?", "bindings": [ 1 ] };
45+
}
46+
47+
function parseOperatorsWithDynamicAndWhere() {
48+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ? AND ""ID"" < ?", "bindings": [ 1, 10 ] };
49+
}
50+
51+
function parseOperatorsWithDynamicOrWhere() {
52+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ? OR ""ID"" < ?", "bindings": [ 1, 0 ] };
4153
}
4254

4355
function parseColumnAliasInWhereSubselect() {

tests/specs/Query/MySQLQueryBuilderSpec.cfc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,20 @@ component extends="tests.resources.AbstractQueryBuilderSpec" {
3636
return { "sql": "SELECT `users`.`foo` FROM `users` WHERE `users`.`foo` = ?", "bindings": [ "bar" ] };
3737
}
3838

39+
function dynamicWhere() {
40+
return { "sql": "SELECT `ID` FROM `users` WHERE `ID` = ?", "bindings": [ 1 ] };
41+
}
42+
3943
function parseOperatorsWithDynamicWhere() {
40-
return { "sql" : "SELECT `ID` FROM `users` WHERE `ID` > ?", "bindings": [ 1 ] }
44+
return { "sql": "SELECT `ID` FROM `users` WHERE `ID` > ?", "bindings": [ 1 ] };
45+
}
46+
47+
function parseOperatorsWithDynamicAndWhere() {
48+
return { "sql": "SELECT `ID` FROM `users` WHERE `ID` > ? AND `ID` < ?", "bindings": [ 1, 10 ] };
49+
}
50+
51+
function parseOperatorsWithDynamicOrWhere() {
52+
return { "sql": "SELECT `ID` FROM `users` WHERE `ID` > ? OR `ID` < ?", "bindings": [ 1, 0 ] };
4153
}
4254

4355
function parseColumnAliasInWhereSubselect() {

tests/specs/Query/OracleQueryBuilderSpec.cfc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,20 @@ component extends="tests.resources.AbstractQueryBuilderSpec" {
3636
return { "sql": "SELECT ""USERS"".""FOO"" FROM ""USERS"" WHERE ""USERS"".""FOO"" = ?", "bindings": [ "bar" ] };
3737
}
3838

39+
function dynamicWhere() {
40+
return { "sql": "SELECT ""ID"" FROM ""USERS"" WHERE ""ID"" = ?", "bindings": [ 1 ] };
41+
}
42+
3943
function parseOperatorsWithDynamicWhere() {
40-
return { "sql" : "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ?", "bindings": [ 1 ] }
44+
return { "sql": "SELECT ""ID"" FROM ""USERS"" WHERE ""ID"" > ?", "bindings": [ 1 ] };
45+
}
46+
47+
function parseOperatorsWithDynamicAndWhere() {
48+
return { "sql": "SELECT ""ID"" FROM ""USERS"" WHERE ""ID"" > ? AND ""ID"" < ?", "bindings": [ 1, 10 ] };
49+
}
50+
51+
function parseOperatorsWithDynamicOrWhere() {
52+
return { "sql": "SELECT ""ID"" FROM ""USERS"" WHERE ""ID"" > ? OR ""ID"" < ?", "bindings": [ 1, 0 ] };
4153
}
4254

4355
function parseColumnAliasInWhereSubselect() {

tests/specs/Query/PostgresQueryBuilderSpec.cfc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,20 @@ component extends="tests.resources.AbstractQueryBuilderSpec" {
3636
return { "sql": "SELECT ""users"".""foo"" FROM ""users"" WHERE ""users"".""foo"" = ?", "bindings": [ "bar" ] };
3737
}
3838

39+
function dynamicWhere() {
40+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" = ?", "bindings": [ 1 ] };
41+
}
42+
3943
function parseOperatorsWithDynamicWhere() {
40-
return { "sql" : "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ?", "bindings": [ 1 ] }
44+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ?", "bindings": [ 1 ] };
45+
}
46+
47+
function parseOperatorsWithDynamicAndWhere() {
48+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ? AND ""ID"" < ?", "bindings": [ 1, 10 ] };
49+
}
50+
51+
function parseOperatorsWithDynamicOrWhere() {
52+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ? OR ""ID"" < ?", "bindings": [ 1, 0 ] };
4153
}
4254

4355
function parseColumnAliasInWhereSubselect() {

tests/specs/Query/SQLiteQueryBuilderSpec.cfc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,20 @@ component extends="tests.resources.AbstractQueryBuilderSpec" {
4343
return { "sql": "SELECT ""users"".""foo"" FROM ""users"" WHERE ""users"".""foo"" = ?", "bindings": [ "bar" ] };
4444
}
4545

46+
function dynamicWhere() {
47+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" = ?", "bindings": [ 1 ] };
48+
}
49+
4650
function parseOperatorsWithDynamicWhere() {
47-
return { "sql" : "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ?", "bindings": [ 1 ] }
51+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ?", "bindings": [ 1 ] };
52+
}
53+
54+
function parseOperatorsWithDynamicAndWhere() {
55+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ? AND ""ID"" < ?", "bindings": [ 1, 10 ] };
56+
}
57+
58+
function parseOperatorsWithDynamicOrWhere() {
59+
return { "sql": "SELECT ""ID"" FROM ""users"" WHERE ""ID"" > ? OR ""ID"" < ?", "bindings": [ 1, 0 ] };
4860
}
4961

5062
function parseColumnAliasInWhereSubselect() {

tests/specs/Query/SqlServerQueryBuilderSpec.cfc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,20 @@ component extends="tests.resources.AbstractQueryBuilderSpec" {
3636
return { "sql": "SELECT [users].[foo] FROM [users] WHERE [users].[foo] = ?", "bindings": [ "bar" ] };
3737
}
3838

39+
function dynamicWhere() {
40+
return { "sql": "SELECT [ID] FROM [users] WHERE [ID] = ?", "bindings": [ 1 ] };
41+
}
42+
3943
function parseOperatorsWithDynamicWhere() {
40-
return { "sql" : "SELECT [ID] FROM [users] WHERE [ID] > ?", "bindings": [ 1 ] }
44+
return { "sql": "SELECT [ID] FROM [users] WHERE [ID] > ?", "bindings": [ 1 ] };
45+
}
46+
47+
function parseOperatorsWithDynamicAndWhere() {
48+
return { "sql": "SELECT [ID] FROM [users] WHERE [ID] > ? AND [ID] < ?", "bindings": [ 1, 10 ] };
49+
}
50+
51+
function parseOperatorsWithDynamicOrWhere() {
52+
return { "sql": "SELECT [ID] FROM [users] WHERE [ID] > ? OR [ID] < ?", "bindings": [ 1, 0 ] };
4153
}
4254

4355
function parseColumnAliasInWhereSubselect() {

0 commit comments

Comments
 (0)