Skip to content

Commit efd3b4f

Browse files
committed
Fix mistic100#544 Always convert int, float and bool values
1 parent 1084cb6 commit efd3b4f

File tree

9 files changed

+61
-52
lines changed

9 files changed

+61
-52
lines changed

src/core.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ QueryBuilder.prototype.createRuleInput = function(rule) {
682682
$valueContainer.show();
683683

684684
$inputs.on('change ' + (filter.input_event || ''), function() {
685-
if (!this._updating_input) {
685+
if (!rule._updating_input) {
686686
rule._updating_value = true;
687687
rule.value = self.getRuleInputValue(rule);
688688
rule._updating_value = false;
@@ -770,6 +770,9 @@ QueryBuilder.prototype.updateRuleOperator = function(rule, previousOperator) {
770770

771771
if (rule.operator) {
772772
rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type);
773+
774+
// refresh value if the format changed for this operator
775+
rule.__.value = this.getRuleInputValue(rule);
773776
}
774777

775778
/**
@@ -782,9 +785,6 @@ QueryBuilder.prototype.updateRuleOperator = function(rule, previousOperator) {
782785
this.trigger('afterUpdateRuleOperator', rule, previousOperator);
783786

784787
this.trigger('rulesChanged');
785-
786-
// FIXME is it necessary ?
787-
this.updateRuleValue(rule, ruleValue);
788788
};
789789

790790
/**

src/data.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -417,11 +417,20 @@ QueryBuilder.prototype.getRuleInputValue = function(rule) {
417417
}
418418
}
419419

420-
if (operator.multiple && filter.value_separator) {
421-
value = value.map(function(val) {
422-
return val.split(filter.value_separator);
423-
});
424-
}
420+
value = value.map(function(val) {
421+
if (operator.multiple && filter.value_separator && typeof val == 'string') {
422+
val = val.split(filter.value_separator);
423+
}
424+
425+
if ($.isArray(val)) {
426+
return val.map(function(subval) {
427+
return Utils.changeType(subval, filter.type);
428+
});
429+
}
430+
else {
431+
return Utils.changeType(val, filter.type);
432+
}
433+
});
425434

426435
if (operator.nb_inputs === 1) {
427436
value = value[0];
@@ -458,7 +467,7 @@ QueryBuilder.prototype.setRuleInputValue = function(rule, value) {
458467
return;
459468
}
460469

461-
this._updating_input = true;
470+
rule._updating_input = true;
462471

463472
if (filter.valueSetter) {
464473
filter.valueSetter.call(this, rule, value);
@@ -499,7 +508,7 @@ QueryBuilder.prototype.setRuleInputValue = function(rule, value) {
499508
}
500509
}
501510

502-
this._updating_input = false;
511+
rule._updating_input = false;
503512
};
504513

505514
/**

src/plugins/mongodb-support/plugin.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ QueryBuilder.extend(/** @lends module:plugins.MongoDbSupport.prototype */ {
132132
else {
133133
var mdb = self.settings.mongoOperators[rule.operator];
134134
var ope = self.getOperatorByType(rule.operator);
135-
var values = [];
136135

137136
if (mdb === undefined) {
138137
Utils.error('UndefinedMongoOperator', 'Unknown MongoDB operation for operator "{0}"', rule.operator);
@@ -142,10 +141,6 @@ QueryBuilder.extend(/** @lends module:plugins.MongoDbSupport.prototype */ {
142141
if (!(rule.value instanceof Array)) {
143142
rule.value = [rule.value];
144143
}
145-
146-
rule.value.forEach(function(v) {
147-
values.push(Utils.changeType(v, rule.type, false));
148-
});
149144
}
150145

151146
/**
@@ -159,7 +154,7 @@ QueryBuilder.extend(/** @lends module:plugins.MongoDbSupport.prototype */ {
159154
var field = self.change('getMongoDBField', rule.field, rule);
160155

161156
var ruleExpression = {};
162-
ruleExpression[field] = mdb.call(self, values);
157+
ruleExpression[field] = mdb.call(self, rule.value);
163158

164159
/**
165160
* Modifies the MongoDB expression generated for a rul
@@ -171,7 +166,7 @@ QueryBuilder.extend(/** @lends module:plugins.MongoDbSupport.prototype */ {
171166
* @param {function} valueWrapper - function that takes the value and adds the operator
172167
* @returns {object}
173168
*/
174-
parts.push(self.change('ruleToMongo', ruleExpression, rule, values, mdb));
169+
parts.push(self.change('ruleToMongo', ruleExpression, rule, rule.value, mdb));
175170
}
176171
});
177172

src/plugins/sql-support/plugin.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,9 @@ QueryBuilder.extend(/** @lends module:plugins.SqlSupport.prototype */ {
256256
nl = !!nl ? '\n' : ' ';
257257
var boolean_as_integer = this.getPluginOptions('sql-support', 'boolean_as_integer');
258258

259-
if (stmt === true) stmt = 'question_mark';
259+
if (stmt === true) {
260+
stmt = 'question_mark';
261+
}
260262
if (typeof stmt == 'string') {
261263
var config = getStmtConfig(stmt);
262264
stmt = this.settings.sqlStatements[config[1]](config[2]);
@@ -301,10 +303,10 @@ QueryBuilder.extend(/** @lends module:plugins.SqlSupport.prototype */ {
301303
value += sql.sep;
302304
}
303305

304-
if (rule.type == 'integer' || rule.type == 'double' || rule.type == 'boolean') {
305-
v = Utils.changeType(v, rule.type, boolean_as_integer);
306+
if (rule.type == 'boolean' && boolean_as_integer) {
307+
v = v ? 1 : 0;
306308
}
307-
else if (!stmt) {
309+
else if (!stmt && rule.type !== 'integer' && rule.type !== 'double' && rule.type !== 'boolean') {
308310
v = Utils.escapeString(v);
309311
}
310312

src/utils.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,30 @@ Utils.error = function() {
103103
* Changes the type of a value to int, float or bool
104104
* @param {*} value
105105
* @param {string} type - 'integer', 'double', 'boolean' or anything else (passthrough)
106-
* @param {boolean} [boolAsInt=false] - return 0 or 1 for booleans
107106
* @returns {*}
108107
*/
109-
Utils.changeType = function(value, type, boolAsInt) {
108+
Utils.changeType = function(value, type) {
109+
if (value === '' || value === undefined) {
110+
return undefined;
111+
}
112+
110113
switch (type) {
111-
// @formatter:off
112-
case 'integer': return parseInt(value);
113-
case 'double': return parseFloat(value);
114+
// @formatter:off
115+
case 'integer':
116+
if (typeof value === 'string' && !/^-?\d+$/.test(value)) {
117+
return value;
118+
}
119+
return parseInt(value);
120+
case 'double':
121+
if (typeof value === 'string' && !/^-?\d+\.?\d*$/.test(value)) {
122+
return value;
123+
}
124+
return parseFloat(value);
114125
case 'boolean':
115-
var bool = value.trim().toLowerCase() === 'true' || value.trim() === '1' || value === 1;
116-
return boolAsInt ? (bool ? 1 : 0) : bool;
126+
if (typeof value === 'string' && !/^(0|1|true|false){1}$/i.test(value)) {
127+
return value;
128+
}
129+
return value === true || value === 1 || value.toLowerCase() === 'true' || value === '1';
117130
default: return value;
118131
// @formatter:on
119132
}

tests/data.module.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ $(function() {
414414
}, {
415415
id: 'age',
416416
operator: 'not_in',
417-
value: ['16', '17', '18']
417+
value: [16, 17, 18]
418418
}]
419419
},
420420
'Should split values on comma and pipe'

tests/plugins.mongo-support.module.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,27 +126,27 @@ $(function(){
126126
}, {
127127
id: 'price',
128128
operator: 'less',
129-
value: '5'
129+
value: 5
130130
}, {
131131
id: 'price',
132132
operator: 'less_or_equal',
133-
value: '5'
133+
value: 5
134134
}, {
135135
id: 'price',
136136
operator: 'greater',
137-
value: '4'
137+
value: 4
138138
}, {
139139
id: 'price',
140140
operator: 'greater_or_equal',
141-
value: '4'
141+
value: 4
142142
}, {
143143
id: 'price',
144144
operator: 'between',
145-
value: ['4','5']
145+
value: [4,5]
146146
}, {
147147
id: 'price',
148148
operator: 'not_between',
149-
value: ['4','5']
149+
value: [4,5]
150150
}, {
151151
id: 'name',
152152
operator: 'begins_with',

tests/plugins.sql-support.module.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,27 +406,27 @@ $(function() {
406406
}, {
407407
id: 'price',
408408
operator: 'less',
409-
value: '5'
409+
value: 5
410410
}, {
411411
id: 'price',
412412
operator: 'less_or_equal',
413-
value: '5'
413+
value: 5
414414
}, {
415415
id: 'price',
416416
operator: 'greater',
417-
value: '4'
417+
value: 4
418418
}, {
419419
id: 'price',
420420
operator: 'greater_or_equal',
421-
value: '4'
421+
value: 4
422422
}, {
423423
id: 'price',
424424
operator: 'between',
425-
value: ['4', '5']
425+
value: [4,5]
426426
}, {
427427
id: 'price',
428428
operator: 'not_between',
429-
value: ['4', '5']
429+
value: [4,5]
430430
}, {
431431
id: 'name',
432432
operator: 'begins_with',

tests/utils.module.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,6 @@ $(function () {
9595
'"10" should be parsed as integer'
9696
);
9797

98-
assert.ok(
99-
Utils.changeType('10.5', 'integer') === 10,
100-
'"10.5" should be parsed as integer'
101-
);
102-
10398
assert.ok(
10499
Utils.changeType('10.5', 'double') === 10.5,
105100
'"10.5" should be parsed as double'
@@ -109,11 +104,6 @@ $(function () {
109104
Utils.changeType('true', 'boolean') === true,
110105
'"true" should be parsed as boolean'
111106
);
112-
113-
assert.ok(
114-
Utils.changeType('false', 'boolean', true) === 0,
115-
'"false" should be parsed as integer'
116-
);
117107
});
118108

119109
/**

0 commit comments

Comments
 (0)