88from ascetic_ddd .faker .domain .generators .interfaces import IAnyInputGenerator , IInputGenerator
99from ascetic_ddd .faker .domain .generators .generators import prepare_input_generator
1010from ascetic_ddd .faker .domain .providers .exceptions import DiamondUpdateConflict
11+ from ascetic_ddd .faker .domain .query .evaluate_visitor import EvaluateWalker
12+ from ascetic_ddd .faker .domain .query .visitors import query_to_dict
1113from ascetic_ddd .session .interfaces import ISession
1214
1315__all__ = ('ValueProvider' ,)
@@ -61,6 +63,7 @@ def output(self) -> T:
6163
6264 def require (self , criteria : dict [str , typing .Any ]) -> None :
6365 new_criteria = parse_query (criteria )
66+ old_criteria = self ._criteria
6467 if self ._criteria is not None :
6568 try :
6669 self ._criteria = self ._criteria + new_criteria
@@ -70,7 +73,16 @@ def require(self, criteria: dict[str, typing.Any]) -> None:
7073 )
7174 else :
7275 self ._criteria = new_criteria
73- self ._output = Nothing ()
76+
77+ if self ._criteria != old_criteria :
78+ if self ._output .is_some ():
79+ if not self .is_transient ():
80+ state = self .state ()
81+ walker = EvaluateWalker ()
82+ if not walker .evaluate_sync (new_criteria , state ):
83+ raise DiamondUpdateConflict (state , query_to_dict (new_criteria ), self .provider_name )
84+ else :
85+ self ._output = Nothing ()
7486
7587 def state (self ) -> typing .Any :
7688 return self ._output .unwrap ()
0 commit comments