@@ -210,13 +210,16 @@ process_ddoc(#st{} = St, DbName, #doc{} = DDoc0) ->
210210 Views = maps :get (? VIEWS , DDoc , undefined ),
211211 Clouseau = maps :get (? CLOUSEAU , DDoc , undefined ),
212212 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 ),
213216 lib_load (St1 , Views ),
214- views_load (St1 , valid_views (Views )),
217+ views_load (St1 , views (Views )),
215218 clouseau_load (St1 , indexes (Clouseau )),
216219 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 )),
220223 St2 = start_or_reset_procs (St1 ),
221224 teach_ddoc_validate (St2 , DDocId , DDoc ),
222225 St2 # st {ddocs = DDocs #{DDocId => DDoc }}
@@ -239,11 +242,11 @@ process_ddoc_functions(#st{} = St, Db, DocId, JsonDoc) ->
239242 DDocFun = fun (DDocId , #{} = DDoc ) ->
240243 try
241244 Filters = maps :get (? FILTERS , DDoc , undefined ),
242- filter_doc_validate (St , DDocId , Filters , JsonDoc ),
243245 VDU = maps :get (? VDU , DDoc , undefined ),
244- vdu_doc_validate (St , DDocId , VDU , JsonDoc ),
245246 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 )
247250 catch
248251 throw :{validate , Error } ->
249252 Meta = #{sid => SId , db => Db , ddoc => DDocId , doc => DocId },
@@ -286,7 +289,7 @@ views_validate(DDocId, #{?VIEWS := Views}, {Db, #st{} = St0}) when
286289 # st {sid = SId , docs = Docs } = St ,
287290 try
288291 lib_load (St , Views ),
289- ViewList = lists :sort (maps :to_list (valid_views (Views ))),
292+ ViewList = lists :sort (maps :to_list (views (Views ))),
290293 case ViewList of
291294 [_ | _ ] ->
292295 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) ->
475478 start_or_reset_sm_proc (St # st {sm_proc = undefined })
476479 end .
477480
478- valid_views (#{} = Views ) ->
481+ views (#{} = Views ) ->
479482 Fun = fun
480483 (? LIB , _ ) ->
481484 false ;
@@ -487,7 +490,7 @@ valid_views(#{} = Views) ->
487490 false
488491 end ,
489492 maps :filter (Fun , Views );
490- valid_views (_ ) ->
493+ views (_ ) ->
491494 #{}.
492495
493496indexes (#{} = Indexes ) ->
@@ -504,6 +507,32 @@ indexes(#{} = Indexes) ->
504507indexes (_ ) ->
505508 #{}.
506509
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+
507536% Math.random(), Date.now() or new Date() will always show as false postives
508537%
509538no_indeterminism (<<FunSrc /binary >>) ->
0 commit comments