1717
1818import static org .mybatis .dynamic .sql .util .StringUtilities .spaceBefore ;
1919
20+ import java .util .HashMap ;
21+ import java .util .List ;
22+ import java .util .Map ;
2023import java .util .Objects ;
2124import java .util .Optional ;
2225import java .util .concurrent .atomic .AtomicInteger ;
@@ -43,50 +46,59 @@ private UpdateRenderer(Builder builder) {
4346 }
4447
4548 public UpdateStatementProvider render () {
46- OptionalFragmentCollector fc = calculateColumnMappings ();
49+ SetPhraseVisitor visitor = new SetPhraseVisitor (sequence , renderingStrategy );
50+
51+ List <Optional <FragmentAndParameters >> fragmentsAndParameters =
52+ updateModel .mapColumnMappings (toFragmentAndParameters (visitor ))
53+ .collect (Collectors .toList ());
4754
4855 return updateModel .whereModel ()
4956 .flatMap (this ::renderWhereClause )
50- .map (wc -> renderWithWhereClause (fc , wc ))
51- .orElseGet (() -> renderWithoutWhereClause (fc ));
57+ .map (wc -> renderWithWhereClause (fragmentsAndParameters , wc ))
58+ .orElseGet (() -> renderWithoutWhereClause (fragmentsAndParameters ));
5259 }
5360
54- private OptionalFragmentCollector calculateColumnMappings () {
55- SetPhraseVisitor visitor = new SetPhraseVisitor (sequence , renderingStrategy );
56-
57- return updateModel .mapColumnMappings (toFragmentAndParameters (visitor ))
58- .collect (OptionalFragmentCollector .collect ());
59- }
60-
61- private UpdateStatementProvider renderWithWhereClause (OptionalFragmentCollector columnMappings ,
61+ private UpdateStatementProvider renderWithWhereClause (List <Optional <FragmentAndParameters >> fragmentsAndParameters ,
6262 WhereClauseProvider whereClause ) {
63- return DefaultUpdateStatementProvider .withUpdateStatement (calculateUpdateStatement (columnMappings , whereClause ))
64- .withParameters (columnMappings . parameters ( ))
63+ return DefaultUpdateStatementProvider .withUpdateStatement (calculateUpdateStatement (fragmentsAndParameters , whereClause ))
64+ .withParameters (calculateParameters ( fragmentsAndParameters ))
6565 .withParameters (whereClause .getParameters ())
6666 .build ();
6767 }
6868
69- private String calculateUpdateStatement (OptionalFragmentCollector fc , WhereClauseProvider whereClause ) {
70- return calculateUpdateStatement (fc )
69+ private String calculateUpdateStatement (List <Optional <FragmentAndParameters >> fragmentsAndParameters ,
70+ WhereClauseProvider whereClause ) {
71+ return calculateUpdateStatement (fragmentsAndParameters )
7172 + spaceBefore (whereClause .getWhereClause ());
7273 }
7374
74- private String calculateUpdateStatement (OptionalFragmentCollector fc ) {
75+ private String calculateUpdateStatement (List < Optional < FragmentAndParameters >> fragmentsAndParameters ) {
7576 return "update" //$NON-NLS-1$
7677 + spaceBefore (updateModel .table ().tableNameAtRuntime ())
77- + spaceBefore (calculateSetPhrase (fc ));
78+ + spaceBefore (calculateSetPhrase (fragmentsAndParameters ));
7879 }
7980
80- private UpdateStatementProvider renderWithoutWhereClause (OptionalFragmentCollector columnMappings ) {
81- return DefaultUpdateStatementProvider .withUpdateStatement (calculateUpdateStatement (columnMappings ))
82- .withParameters (columnMappings . parameters ( ))
81+ private UpdateStatementProvider renderWithoutWhereClause (List < Optional < FragmentAndParameters >> fragmentsAndParameters ) {
82+ return DefaultUpdateStatementProvider .withUpdateStatement (calculateUpdateStatement (fragmentsAndParameters ))
83+ .withParameters (calculateParameters ( fragmentsAndParameters ))
8384 .build ();
8485 }
8586
86- private String calculateSetPhrase (OptionalFragmentCollector collector ) {
87- return collector .fragments ()
87+ private String calculateSetPhrase (List <Optional <FragmentAndParameters >> fragmentsAndParameters ) {
88+ return fragmentsAndParameters .stream ()
89+ .filter (Optional ::isPresent )
90+ .map (Optional ::get )
91+ .map (FragmentAndParameters ::fragment )
8892 .collect (Collectors .joining (", " , "set " , "" )); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
8993 }
94+
95+ private Map <String , Object > calculateParameters (List <Optional <FragmentAndParameters >> fragmentsAndParameters ) {
96+ return fragmentsAndParameters .stream ()
97+ .filter (Optional ::isPresent )
98+ .map (Optional ::get )
99+ .map (FragmentAndParameters ::parameters )
100+ .collect (HashMap ::new , HashMap ::putAll , HashMap ::putAll );
101+ }
90102
91103 private Optional <WhereClauseProvider > renderWhereClause (WhereModel whereModel ) {
92104 return WhereRenderer .withWhereModel (whereModel )
0 commit comments