Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions force-app/main/default/classes/QCondition.cls
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,15 @@ public class QCondition implements QICondition {
List<String> values = new List<String>();
for (Object value : (List<Object>) val) {
if (value instanceof String) {
values.add('\'' + String.escapeSingleQuotes((String) value) + '\'');
values.add('\'' + escapeSoqlValue((String) value) + '\'');
} else {
values.add((String) value);
}
}
return String.join(values, ', ');
}
if (val instanceof String) {
return '\'' + String.escapeSingleQuotes((String) val) + '\'';
return '\'' + escapeSoqlValue((String) val) + '\'';
} else if (val instanceof Date) {
String dateString = String.valueOf(val);
return dateString.substring(0, dateString.indexOf(' '));
Expand All @@ -44,6 +44,10 @@ public class QCondition implements QICondition {
}
}

private String escapeSoqlValue(String value) {
return String.escapeSingleQuotes(value.replace('\\', '\\\\'));
}

public QCondition equalsTo(Object value) {
this.operatorValue = ComparisonOperator.EQUALS;
this.fieldValue = value;
Expand Down
117 changes: 71 additions & 46 deletions force-app/main/default/classes/QTest.cls
Original file line number Diff line number Diff line change
Expand Up @@ -115,59 +115,84 @@ private class QTest {
}

@isTest
static void testOrGroup() {
String query =
new Q(Account.SObjectType)
.add(Q.orGroup()
.add(Q.condition('Name').equalsTo('test'))
.add(Q.condition('Name').equalsTo('test'))
)
.build();
static void testEscapedBackslash() {
// test when name contains single quote ' char. E.g. - Acme's Carwash
String query =
new Q(Account.SObjectType)
.add(Q.condition('Name').equalsTo('Acme\'s Carwash'))
.build();

String expected = 'SELECT Id FROM Account WHERE Name = \'Acme\\\'s Carwash\'';
System.assertEquals(expected, query, 'Backslash should be escaped correctly');
Database.query(query);
}

@isTest
static void testEscapedBackslash2() {
// test name contains backslash \ char. E.g. - Acme\s Carwash
String query =
new Q(Account.SObjectType)
.add(Q.condition('Name').equalsTo('Acme\\s Carwash'))
.build();
String expected = 'SELECT Id FROM Account WHERE Name = \'Acme\\\\\\\\s Carwash\'';
System.assertEquals('SELECT Id FROM Account WHERE Name = \'Acme\\\\\\\\s Carwash\'', query, 'Backslash should be escaped correctly');
Database.query(query);
}

@isTest
static void testOrGroup() {
String query =
new Q(Account.SObjectType)
.add(Q.orGroup()
.add(Q.condition('Name').equalsTo('test'))
.add(Q.condition('Name').equalsTo('test'))
)
.build();

String expected = 'SELECT Id FROM Account WHERE (Name = \'test\' OR Name = \'test\')';
System.assertEquals(expected, query, 'It should output a query with a condition group.');
Database.query(query);

List<QCondition> conditions = new List<QCondition>();
conditions.add(Q.condition('Name').equalsTo('test'));
conditions.add(Q.condition('Name').equalsTo('test'));
QOrGroup sbOrGroup = new QOrGroup(conditions);
query =
new Q(Account.SObjectType)
.add(sbOrGroup)
.build();
System.assertEquals(expected, query, 'It should output a query with a condition group.');
Database.query(query);

List<QCondition> conditions = new List<QCondition>();
conditions.add(Q.condition('Name').equalsTo('test'));
conditions.add(Q.condition('Name').equalsTo('test'));
QOrGroup sbOrGroup = new QOrGroup(conditions);
query =
new Q(Account.SObjectType)
.add(sbOrGroup)
.build();

String expected2 = 'SELECT Id FROM Account WHERE (Name = \'test\' OR Name = \'test\')';
System.assertEquals(expected2, query, 'It should output a query with a condition group.');
Database.query(query);
}

@isTest
static void testAndGroup() {
String query =
new Q(Account.SObjectType)
.add(Q.andGroup()
.add(Q.condition('Name').equalsTo('test'))
.add(Q.condition('Name').equalsTo('test'))
)
.build();
System.assertEquals(expected2, query, 'It should output a query with a condition group.');
Database.query(query);
}

@isTest
static void testAndGroup() {
String query =
new Q(Account.SObjectType)
.add(Q.andGroup()
.add(Q.condition('Name').equalsTo('test'))
.add(Q.condition('Name').equalsTo('test'))
)
.build();

String expected = 'SELECT Id FROM Account WHERE (Name = \'test\' AND Name = \'test\')';
System.assertEquals(expected, query, 'It should output a query with a condition group.');
Database.query(query);

List<QCondition> conditions = new List<QCondition>();
conditions.add(Q.condition('Name').equalsTo('test'));
conditions.add(Q.condition('Name').equalsTo('test'));
QAndGroup sbAndGroup = new QAndGroup(conditions);
query =
new Q(Account.SObjectType)
.add(sbAndGroup)
.build();
System.assertEquals(expected, query, 'It should output a query with a condition group.');
Database.query(query);

List<QCondition> conditions = new List<QCondition>();
conditions.add(Q.condition('Name').equalsTo('test'));
conditions.add(Q.condition('Name').equalsTo('test'));
QAndGroup sbAndGroup = new QAndGroup(conditions);
query =
new Q(Account.SObjectType)
.add(sbAndGroup)
.build();

String expected2 = 'SELECT Id FROM Account WHERE (Name = \'test\' AND Name = \'test\')';
System.assertEquals(expected2, query, 'It should output a query with a condition group.');
Database.query(query);
}
System.assertEquals(expected2, query, 'It should output a query with a condition group.');
Database.query(query);
}

}