@@ -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