3232import java .util .List ;
3333import java .util .Map ;
3434import java .util .Map .Entry ;
35+ import java .util .SortedSet ;
36+ import java .util .TreeSet ;
3537import javax .annotation .Nonnull ;
3638import javax .annotation .Nullable ;
3739
@@ -56,10 +58,18 @@ abstract class UpdateBuilder<T extends UpdateBuilder> {
5658 private static Map <String , Object > expandObject (Map <FieldPath , Object > data ) {
5759 Map <String , Object > result = new HashMap <>();
5860
59- for (Map .Entry <FieldPath , Object > entrySet : data .entrySet ()) {
60- List <String > segments = entrySet .getKey ().getSegments ();
61- Object value = entrySet .getValue ();
61+ SortedSet <FieldPath > sortedFields = new TreeSet <>(data .keySet ());
6262
63+ FieldPath lastField = null ;
64+
65+ for (FieldPath field : sortedFields ) {
66+ if (lastField != null && lastField .isPrefixOf (field )) {
67+ throw new IllegalArgumentException (
68+ String .format ("Detected ambiguous definition for field '%s'." , lastField ));
69+ }
70+
71+ List <String > segments = field .getSegments ();
72+ Object value = data .get (field );
6373 Map <String , Object > currentMap = result ;
6474
6575 for (int i = 0 ; i < segments .size (); ++i ) {
@@ -69,9 +79,12 @@ private static Map<String, Object> expandObject(Map<FieldPath, Object> data) {
6979 if (!currentMap .containsKey (segments .get (i ))) {
7080 currentMap .put (segments .get (i ), new HashMap <>());
7181 }
82+
7283 currentMap = (Map <String , Object >) currentMap .get (segments .get (i ));
7384 }
7485 }
86+
87+ lastField = field ;
7588 }
7689
7790 return result ;
0 commit comments