Skip to content

Commit c1c451e

Browse files
committed
Close #461 [sql-support] Auto-detect filter by field name
1 parent 18ab732 commit c1c451e

5 files changed

Lines changed: 92 additions & 26 deletions

File tree

examples/index.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ <h3>Output</h3>
128128
<!-- injector:js -->
129129
<script src="../src/main.js"></script>
130130
<script src="../src/defaults.js"></script>
131+
<script src="../src/plugins.js"></script>
131132
<script src="../src/core.js"></script>
132133
<script src="../src/public.js"></script>
133134
<script src="../src/data.js"></script>
@@ -208,6 +209,7 @@ <h3>Output</h3>
208209
*/
209210
{
210211
id: 'name',
212+
field: 'username',
211213
label: {
212214
en: 'Name',
213215
fr: 'Nom'
@@ -582,7 +584,7 @@ <h3>Output</h3>
582584

583585
// set rules from SQL
584586
$('.set-sql').on('click', function() {
585-
$('#builder').queryBuilder('setRulesFromSQL', 'name NOT LIKE "Mistic%" OR price BETWEEN 100 OR 200 OR NOT (category IN(1, 2) AND rate <= 2)');
587+
$('#builder').queryBuilder('setRulesFromSQL', 'username NOT LIKE "Mistic%" OR price BETWEEN 100 OR 200 OR NOT (category IN(1, 2) AND rate <= 2)');
586588
});
587589

588590
// reset builder

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jQuery-QueryBuilder",
3-
"version": "2.4.0",
3+
"version": "2.5.0",
44
"author": {
55
"name": "Damien \"Mistic\" Sorel",
66
"email": "contact@git.strangeplanet.fr",

src/plugins/sql-support/plugin.js

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -545,15 +545,7 @@ QueryBuilder.extend(/** @lends module:plugins.SqlSupport.prototype */ {
545545
Utils.error('SQLParse', 'Cannot find field name in {0}', JSON.stringify(data.left));
546546
}
547547

548-
/**
549-
* Returns a filter identifier from the SQL field
550-
* @event changer:getSQLFieldID
551-
* @memberof module:plugins.SqlSupport
552-
* @param {string} field
553-
* @param {*} value
554-
* @returns {string}
555-
*/
556-
var id = self.change('getSQLFieldID', field, value);
548+
var id = self.getSQLFieldID(field, value);
557549

558550
/**
559551
* Modifies the rule generated from the SQL expression
@@ -583,6 +575,39 @@ QueryBuilder.extend(/** @lends module:plugins.SqlSupport.prototype */ {
583575
*/
584576
setRulesFromSQL: function(query, stmt) {
585577
this.setRules(this.getRulesFromSQL(query, stmt));
578+
},
579+
580+
/**
581+
* Returns a filter identifier from the SQL field.
582+
* Automatically use the only one filter with a matching field, fires a changer otherwise.
583+
* @param {string} field
584+
* @param {*} value
585+
* @fires module:plugins.SqlSupport:changer:getSQLFieldID
586+
* @returns {string}
587+
* @private
588+
*/
589+
getSQLFieldID: function(field, value) {
590+
var matchingFilters = this.filters.filter(function(filter) {
591+
return filter.field === field;
592+
});
593+
594+
var id;
595+
if (matchingFilters.length === 1) {
596+
id = matchingFilters[0].id;
597+
}
598+
else {
599+
/**
600+
* Returns a filter identifier from the SQL field
601+
* @event changer:getSQLFieldID
602+
* @memberof module:plugins.SqlSupport
603+
* @param {string} field
604+
* @param {*} value
605+
* @returns {string}
606+
*/
607+
id = this.change('getSQLFieldID', field, value);
608+
}
609+
610+
return id;
586611
}
587612
});
588613

tests/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<!-- injector:src -->
3434
<script src="../src/main.js" data-cover></script>
3535
<script src="../src/defaults.js" data-cover></script>
36+
<script src="../src/plugins.js" data-cover></script>
3637
<script src="../src/core.js" data-cover></script>
3738
<script src="../src/public.js" data-cover></script>
3839
<script src="../src/data.js" data-cover></script>

tests/plugins.sql-support.module.js

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
$(function () {
1+
$(function() {
22
var $b = $('#builder');
33

44
QUnit.module('plugins.sql-support', {
5-
afterEach: function () {
5+
afterEach: function() {
66
$b.queryBuilder('destroy');
77
}
88
});
99

10-
QUnit.test('Raw SQL', function (assert) {
10+
QUnit.test('Raw SQL', function(assert) {
1111
$b.queryBuilder({
1212
filters: basic_filters,
1313
rules: basic_rules
@@ -30,7 +30,7 @@ $(function () {
3030
);
3131
});
3232

33-
QUnit.test('Placeholder SQL', function (assert) {
33+
QUnit.test('Placeholder SQL', function(assert) {
3434
$b.queryBuilder({
3535
filters: basic_filters,
3636
rules: basic_rules
@@ -53,7 +53,7 @@ $(function () {
5353
);
5454
});
5555

56-
QUnit.test('Numbered SQL', function (assert) {
56+
QUnit.test('Numbered SQL', function(assert) {
5757
$b.queryBuilder({
5858
filters: basic_filters,
5959
rules: basic_rules
@@ -92,7 +92,7 @@ $(function () {
9292
);
9393
});
9494

95-
QUnit.test('Named SQL', function (assert) {
95+
QUnit.test('Named SQL', function(assert) {
9696
$b.queryBuilder({
9797
filters: basic_filters,
9898
rules: basic_rules
@@ -131,7 +131,7 @@ $(function () {
131131
);
132132
});
133133

134-
QUnit.test('All operators', function (assert) {
134+
QUnit.test('All operators', function(assert) {
135135
$b.queryBuilder({
136136
filters: basic_filters,
137137
rules: all_operators_rules
@@ -154,14 +154,14 @@ $(function () {
154154
);
155155
});
156156

157-
QUnit.test('Nested rules', function (assert) {
157+
QUnit.test('Nested rules', function(assert) {
158158

159159
$b.queryBuilder({
160160
filters: [
161-
{id: 'a', type: 'integer'},
162-
{id: 'b', type: 'integer'},
163-
{id: 'c', type: 'integer'},
164-
{id: 'd', type: 'integer'}
161+
{ id: 'a', type: 'integer' },
162+
{ id: 'b', type: 'integer' },
163+
{ id: 'c', type: 'integer' },
164+
{ id: 'd', type: 'integer' }
165165
]
166166
});
167167

@@ -191,7 +191,7 @@ $(function () {
191191
);
192192
});
193193

194-
QUnit.test('Custom export/parsing', function (assert) {
194+
QUnit.test('Custom export/parsing', function(assert) {
195195
var rules = {
196196
condition: 'AND',
197197
rules: [
@@ -225,13 +225,13 @@ $(function () {
225225
]
226226
});
227227

228-
$b.on('ruleToSQL.queryBuilder.filter', function (e, rule, sqlValue, sqlOperator) {
228+
$b.on('ruleToSQL.queryBuilder.filter', function(e, rule, sqlValue, sqlOperator) {
229229
if (rule.id === 'last_days') {
230230
e.value = rule.field + ' ' + sqlOperator('DATE_SUB(NOW(), INTERVAL ' + sqlValue + ' DAY)');
231231
}
232232
});
233233

234-
$b.on('parseSQLNode.queryBuilder.filter', function (e) {
234+
$b.on('parseSQLNode.queryBuilder.filter', function(e) {
235235
var data = e.value;
236236
// left must be the field name and right must be the date_sub function
237237
if (data.left && data.left.value == 'display_date' && data.operation == '>' && data.right && data.right.name == 'DATE_SUB') {
@@ -269,6 +269,44 @@ $(function () {
269269
);
270270
});
271271

272+
QUnit.test('Automatically use filter from field', function(assert) {
273+
var rules = {
274+
condition: 'AND',
275+
rules: [
276+
{
277+
id: 'name',
278+
operator: 'equal',
279+
value: 'Mistic'
280+
}
281+
]
282+
};
283+
284+
var sql = 'username = \'Mistic\'';
285+
286+
$b.queryBuilder({
287+
filters: [
288+
{
289+
id: 'name',
290+
field: 'username',
291+
type: 'string'
292+
},
293+
{
294+
id: 'last_days',
295+
field: 'display_date',
296+
type: 'integer'
297+
}
298+
]
299+
});
300+
301+
$b.queryBuilder('setRulesFromSQL', sql);
302+
303+
assert.rulesMatch(
304+
$b.queryBuilder('getRules'),
305+
rules,
306+
'Should use "name" filter from "username" field'
307+
);
308+
});
309+
272310

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

0 commit comments

Comments
 (0)