@@ -44,72 +44,60 @@ class ResultTreeProcessor {
4444 EntityNode _dehydrateNode (String queryId, dynamic data,
4545 CacheProvider cacheProvider, Set <String > impactedQueryIds) {
4646 if (data is Map <String , dynamic >) {
47- if (data.containsKey (kGlobalIDKey)) {
48- // data contains a unique entity id. we can normalize
49- final guid = data[kGlobalIDKey] as String ;
50-
51- final serverValues = < String , dynamic > {};
52- final nestedObjects = < String , EntityNode > {};
53- final nestedObjectLists = < String , List <EntityNode >> {};
54-
55- for (final entry in data.entries) {
56- final key = entry.key;
57- final value = entry.value;
58-
59- if (value is Map <String , dynamic >) {
60- EntityNode en =
61- _dehydrateNode (queryId, value, cacheProvider, impactedQueryIds);
62- nestedObjects[key] = en;
63- } else if (value is List ) {
64- final nodeList = < EntityNode > [];
65- for (final item in value) {
47+ // data contains a unique entity id. we can normalize
48+ final guid = data[kGlobalIDKey] as String ? ;
49+
50+ final serverValues = < String , dynamic > {};
51+ final nestedObjects = < String , EntityNode > {};
52+ final nestedObjectLists = < String , List <EntityNode >> {};
53+
54+ for (final entry in data.entries) {
55+ final key = entry.key;
56+ final value = entry.value;
57+
58+ if (value is Map <String , dynamic >) {
59+ EntityNode en =
60+ _dehydrateNode (queryId, value, cacheProvider, impactedQueryIds);
61+ nestedObjects[key] = en;
62+ } else if (value is List ) {
63+ final nodeList = < EntityNode > [];
64+ final scalarValueList = < dynamic > [];
65+ for (final item in value) {
66+ if (item is Map <String , dynamic >) {
6667 nodeList.add (_dehydrateNode (
6768 queryId, item, cacheProvider, impactedQueryIds));
69+ } else {
70+ // assuming scalar - we don't handle array of arrays
71+ scalarValueList.add (item);
6872 }
73+ }
74+
75+ // we either do object lists or scalar lists stored with scalars
76+ // we don't handle mixed lists.
77+ if (nodeList.isNotEmpty) {
6978 nestedObjectLists[key] = nodeList;
7079 } else {
71- serverValues[key] = value ;
80+ serverValues[key] = scalarValueList ;
7281 }
82+ } else {
83+ serverValues[key] = value;
7384 }
85+ }
7486
87+ if (guid != null ) {
7588 final existingEdo = cacheProvider.getEntityDataObject (guid);
76- existingEdo.referencedFrom.add (queryId);
77- impactedQueryIds.addAll (existingEdo.referencedFrom);
89+ //existingEdo.referencedFrom.add(queryId);
7890 existingEdo.setServerValues (serverValues, queryId);
7991 cacheProvider.saveEntityDataObject (existingEdo);
92+ impactedQueryIds.addAll (existingEdo.referencedFrom);
8093
8194 return EntityNode (
8295 entity: existingEdo,
8396 nestedObjects: nestedObjects,
8497 nestedObjectLists: nestedObjectLists);
8598 } else {
86- // GlobalID check
87- // no entity id. scalar data must be stored inline.
88- final scalarValues = < String , dynamic > {};
89- final nestedObjects = < String , EntityNode > {};
90- final nestedObjectLists = < String , List <EntityNode >> {};
91-
92- for (final entry in data.entries) {
93- final key = entry.key;
94- final value = entry.value;
95-
96- if (value is Map <String , dynamic >) {
97- nestedObjects[key] =
98- _dehydrateNode (queryId, value, cacheProvider, impactedQueryIds);
99- } else if (value is List ) {
100- final nodeList = < EntityNode > [];
101- for (final item in value) {
102- nodeList.add (_dehydrateNode (
103- queryId, item, cacheProvider, impactedQueryIds));
104- }
105- nestedObjectLists[key] = nodeList;
106- } else {
107- scalarValues[key] = value;
108- }
109- }
110-
11199 return EntityNode (
112- scalarValues: scalarValues ,
100+ scalarValues: serverValues ,
113101 nestedObjects: nestedObjects,
114102 nestedObjectLists: nestedObjectLists);
115103 }
@@ -129,47 +117,34 @@ class ResultTreeProcessor {
129117
130118 Future <dynamic > _hydrateNode (
131119 EntityNode node, CacheProvider cacheProvider) async {
120+ final Map <String , dynamic > data = {};
132121 if (node.entity != null ) {
133122 final edo = cacheProvider.getEntityDataObject (node.entity! .guid);
134- final data = Map <String , dynamic >.from (edo.fields ());
135-
136- if (node.nestedObjects != null ) {
137- for (final entry in node.nestedObjects! .entries) {
138- data[entry.key] = await _hydrateNode (entry.value, cacheProvider);
139- }
140- }
141-
142- if (node.nestedObjectLists != null ) {
143- for (final entry in node.nestedObjectLists! .entries) {
144- final list = < dynamic > [];
145- for (final item in entry.value) {
146- list.add (await _hydrateNode (item, cacheProvider));
147- }
148- data[entry.key] = list;
149- }
150- }
123+ data.addAll (edo.fields ());
124+ }
151125
152- return data;
153- } else if (node.scalarValues != null ) {
126+ if (node.scalarValues != null ) {
154127 if (node.scalarValues! .containsKey ('value' )) {
155128 return node.scalarValues! ['value' ];
156129 }
157130 return node.scalarValues;
158- } else if (node.nestedObjects != null ) {
159- final data = < String , dynamic > {};
131+ }
132+ if (node.nestedObjects != null ) {
160133 for (final entry in node.nestedObjects! .entries) {
161134 data[entry.key] = await _hydrateNode (entry.value, cacheProvider);
162135 }
163- return data;
164- } else if (node.nestedObjectLists != null &&
165- node.nestedObjectLists! .containsKey ('list' )) {
166- final list = < dynamic > [];
167- for (final item in node.nestedObjectLists! ['list' ]! ) {
168- list.add (await _hydrateNode (item, cacheProvider));
136+ }
137+
138+ if (node.nestedObjectLists != null ) {
139+ for (final entry in node.nestedObjectLists! .entries) {
140+ final list = < dynamic > [];
141+ for (final item in entry.value) {
142+ list.add (await _hydrateNode (item, cacheProvider));
143+ }
144+ data[entry.key] = list;
169145 }
170- return list;
171- } else {
172- return {};
173146 }
147+
148+ return data;
174149 }
175150}
0 commit comments