@@ -210,13 +210,16 @@ process_ddoc(#st{} = St, DbName, #doc{} = DDoc0) ->
210
210
Views = maps :get (? VIEWS , DDoc , undefined ),
211
211
Clouseau = maps :get (? CLOUSEAU , DDoc , undefined ),
212
212
Nouveau = maps :get (? NOUVEAU , DDoc , undefined ),
213
+ Filters = maps :get (? FILTERS , DDoc , undefined ),
214
+ Updates = maps :get (? UPDATES , DDoc , undefined ),
215
+ Vdu = maps :get (? VDU , DDoc , undefined ),
213
216
lib_load (St1 , Views ),
214
- views_load (St1 , valid_views (Views )),
217
+ views_load (St1 , views (Views )),
215
218
clouseau_load (St1 , indexes (Clouseau )),
216
219
nouveau_load (St1 , indexes (Nouveau )),
217
- filters_load (St1 , maps : get ( ? FILTERS , DDoc , undefined )),
218
- updates_load (St1 , maps : get ( ? UPDATES , DDoc , undefined )),
219
- vdu_load (St1 , maps : get ( ? VDU , DDoc , undefined )),
220
+ filters_load (St1 , filters ( Filters )),
221
+ updates_load (St1 , updates ( Updates )),
222
+ vdu_load (St1 , vdu ( Vdu )),
220
223
St2 = start_or_reset_procs (St1 ),
221
224
teach_ddoc_validate (St2 , DDocId , DDoc ),
222
225
St2 # st {ddocs = DDocs #{DDocId => DDoc }}
@@ -239,11 +242,11 @@ process_ddoc_functions(#st{} = St, Db, DocId, JsonDoc) ->
239
242
DDocFun = fun (DDocId , #{} = DDoc ) ->
240
243
try
241
244
Filters = maps :get (? FILTERS , DDoc , undefined ),
242
- filter_doc_validate (St , DDocId , Filters , JsonDoc ),
243
245
VDU = maps :get (? VDU , DDoc , undefined ),
244
- vdu_doc_validate (St , DDocId , VDU , JsonDoc ),
245
246
Updates = maps :get (? UPDATES , DDoc , undefined ),
246
- update_doc_validate (St , DDocId , Updates , JsonDoc )
247
+ filter_doc_validate (St , DDocId , filters (Filters ), JsonDoc ),
248
+ vdu_doc_validate (St , DDocId , vdu (VDU ), JsonDoc ),
249
+ update_doc_validate (St , DDocId , updates (Updates ), JsonDoc )
247
250
catch
248
251
throw :{validate , Error } ->
249
252
Meta = #{sid => SId , db => Db , ddoc => DDocId , doc => DocId },
@@ -286,7 +289,7 @@ views_validate(DDocId, #{?VIEWS := Views}, {Db, #st{} = St0}) when
286
289
# st {sid = SId , docs = Docs } = St ,
287
290
try
288
291
lib_load (St , Views ),
289
- ViewList = lists :sort (maps :to_list (valid_views (Views ))),
292
+ ViewList = lists :sort (maps :to_list (views (Views ))),
290
293
case ViewList of
291
294
[_ | _ ] ->
292
295
Fun = fun ({Name , #{? MAP := Src }}) -> add_fun_load (St , Name , Src ) end ,
@@ -475,7 +478,7 @@ start_or_reset_sm_proc(#st{sm_proc = #proc{} = Proc} = St) ->
475
478
start_or_reset_sm_proc (St # st {sm_proc = undefined })
476
479
end .
477
480
478
- valid_views (#{} = Views ) ->
481
+ views (#{} = Views ) ->
479
482
Fun = fun
480
483
(? LIB , _ ) ->
481
484
false ;
@@ -487,7 +490,7 @@ valid_views(#{} = Views) ->
487
490
false
488
491
end ,
489
492
maps :filter (Fun , Views );
490
- valid_views (_ ) ->
493
+ views (_ ) ->
491
494
#{}.
492
495
493
496
indexes (#{} = Indexes ) ->
@@ -504,6 +507,32 @@ indexes(#{} = Indexes) ->
504
507
indexes (_ ) ->
505
508
#{}.
506
509
510
+ updates (#{} = Updates ) ->
511
+ Fun = fun
512
+ (<<_ /binary >>, <<FunSrc /binary >>) -> no_indeterminism (FunSrc );
513
+ (_ , _ ) -> false
514
+ end ,
515
+ maps :filter (Fun , Updates );
516
+ updates (_ ) ->
517
+ #{}.
518
+
519
+ filters (#{} = Filters ) ->
520
+ Fun = fun
521
+ (<<_ /binary >>, <<FunSrc /binary >>) -> no_indeterminism (FunSrc );
522
+ (_ , _ ) -> false
523
+ end ,
524
+ maps :filter (Fun , Filters );
525
+ filters (_ ) ->
526
+ #{}.
527
+
528
+ vdu (<<FunSrc /binary >>) ->
529
+ case no_indeterminism (FunSrc ) of
530
+ true -> FunSrc ;
531
+ false -> undefined
532
+ end ;
533
+ vdu (_ ) ->
534
+ undefined .
535
+
507
536
% Math.random(), Date.now() or new Date() will always show as false postives
508
537
%
509
538
no_indeterminism (<<FunSrc /binary >>) ->
0 commit comments