Skip to content

Commit c72d367

Browse files
committed
Close #334 sql-support compatible with custom methods
1 parent 8df0ce6 commit c72d367

File tree

5 files changed

+91
-8
lines changed

5 files changed

+91
-8
lines changed

.editorconfig

+3
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ insert_final_newline = false
1313

1414
[*.scss]
1515
indent_size = 2
16+
17+
[*.html]
18+
indent_size = 2

bower.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"bootstrap-select": "^1.10.0",
2626
"bootbox": "^4.4.0",
2727
"awesome-bootstrap-checkbox": "^0.3.0",
28-
"sql-parser": "^1.0.0",
28+
"sql-parser": "^1.1.0",
2929
"bind-polyfill": "~1.0.0",
3030
"interact": "^1.2.6"
3131
},

src/plugins/mongodb-support/plugin.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// ===============================
88
QueryBuilder.defaults({
99
mongoOperators: {
10+
// @formatter:off
1011
equal: function(v) { return v[0]; },
1112
not_equal: function(v) { return { '$ne': v[0] }; },
1213
in: function(v) { return { '$in': v }; },
@@ -27,6 +28,7 @@ QueryBuilder.defaults({
2728
is_not_empty: function(v) { return { '$ne': '' }; },
2829
is_null: function(v) { return null; },
2930
is_not_null: function(v) { return { '$ne': null }; }
31+
// @formatter:on
3032
},
3133

3234
mongoRuleOperators: {
@@ -130,7 +132,7 @@ QueryBuilder.extend({
130132
var ruleExpression = {};
131133
var field = self.change('getMongoDBField', rule.field, rule);
132134
ruleExpression[field] = mdb.call(self, values);
133-
parts.push(self.change('ruleToMongo', ruleExpression, rule));
135+
parts.push(self.change('ruleToMongo', ruleExpression, rule, values, mdb));
134136
}
135137
});
136138

src/plugins/sql-support/plugin.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,12 @@ QueryBuilder.extend({
290290
});
291291
}
292292

293-
var ruleExpression = self.change('getSQLField', rule.field, rule) + ' ' + sql.op.replace(/\?/, value);
294-
parts.push(self.change('ruleToSQL', ruleExpression, rule));
293+
var sqlFn = function(v) {
294+
return sql.op.replace(/\?/, v);
295+
};
296+
297+
var ruleExpression = self.change('getSQLField', rule.field, rule) + ' ' + sqlFn(value);
298+
parts.push(self.change('ruleToSQL', ruleExpression, rule, value, sqlFn));
295299
}
296300
});
297301

@@ -413,10 +417,6 @@ QueryBuilder.extend({
413417
}
414418
// it's a leaf
415419
else {
416-
if (data.left.value === undefined || data.right.value === undefined) {
417-
Utils.error('SQLParse', 'Missing field and/or value');
418-
}
419-
420420
if ($.isPlainObject(data.right.value)) {
421421
Utils.error('SQLParse', 'Value format not supported for {0}.', data.left.value);
422422
}

tests/plugins.sql-support.module.js

+78
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,84 @@ $(function () {
191191
);
192192
});
193193

194+
QUnit.test('Custom export/parsing', function (assert) {
195+
var rules = {
196+
condition: 'AND',
197+
rules: [
198+
{
199+
id: 'name',
200+
operator: 'equal',
201+
value: 'Mistic'
202+
},
203+
{
204+
id: 'last_days',
205+
operator: 'greater',
206+
value: 5
207+
}
208+
]
209+
};
210+
211+
var sql = 'name = \'Mistic\' AND display_date > DATE_SUB(NOW(), INTERVAL 5 DAY)';
212+
213+
$b.queryBuilder({
214+
filters: [
215+
{
216+
id: 'name',
217+
type: 'string'
218+
},
219+
{
220+
id: 'last_days',
221+
field: 'display_date',
222+
type: 'integer',
223+
operators: ['greater']
224+
}
225+
]
226+
});
227+
228+
$b.on('ruleToSQL.queryBuilder.filter', function (e, rule, sqlValue, sqlOperator) {
229+
if (rule.id === 'last_days') {
230+
e.value = rule.field + ' ' + sqlOperator('DATE_SUB(NOW(), INTERVAL ' + sqlValue + ' DAY)');
231+
}
232+
});
233+
234+
$b.on('parseSQLNode.queryBuilder.filter', function (e) {
235+
var data = e.value;
236+
// left must be the field name and right must be the date_sub function
237+
if (data.left && data.left.value == 'display_date' && data.operation == '>' && data.right && data.right.name == 'DATE_SUB') {
238+
var right = data.right;
239+
// 1st argument is "NOW()" and 2nd argument is a list
240+
if (right.arguments.value.length === 2 && right.arguments.value[1].value.length === 3) {
241+
var params = right.arguments.value[1].value;
242+
// 1st item is "INTERVAL", 2nd item is the value, 3rd item is "DAY"
243+
if (params[0].value == 'INTERVAL' && params[2].value == 'DAY') {
244+
e.value = {
245+
id: 'last_days',
246+
operator: 'greater',
247+
value: params[1].value
248+
};
249+
}
250+
}
251+
}
252+
});
253+
254+
$b.queryBuilder('setRules', rules);
255+
256+
assert.equal(
257+
$b.queryBuilder('getSQL').sql,
258+
sql,
259+
'Should export custom date_sub function'
260+
);
261+
262+
$b.queryBuilder('reset');
263+
$b.queryBuilder('setRulesFromSQL', sql);
264+
265+
assert.rulesMatch(
266+
$b.queryBuilder('getRules'),
267+
rules,
268+
'Should parse date_sub function'
269+
);
270+
});
271+
194272

195273
var basic_rules_sql_raw = {
196274
sql: 'price < 10.25 AND name IS NULL AND ( category IN(\'mo\', \'mu\') OR id != \'1234-azer-5678\' ) '

0 commit comments

Comments
 (0)