2222import com .arcadedb .database .DetachedDocument ;
2323import com .arcadedb .database .Document ;
2424import com .arcadedb .graph .Edge ;
25+ import com .arcadedb .graph .IterableGraph ;
2526import com .arcadedb .graph .Vertex ;
2627import com .arcadedb .query .sql .executor .Result ;
2728import com .arcadedb .query .sql .executor .ResultSet ;
@@ -55,8 +56,7 @@ public static JsonSerializer createJsonSerializer() {
5556
5657 public JSONObject serializeDocument (final Document document ) {
5758 final Database database = document .getDatabase ();
58- final JSONObject object = new JSONObject ()
59- .setDateFormat (database .getSchema ().getDateTimeFormat ())
59+ final JSONObject object = new JSONObject ().setDateFormat (database .getSchema ().getDateTimeFormat ())
6060 .setDateTimeFormat (database .getSchema ().getDateTimeFormat ());
6161
6262 if (document .getIdentity () != null )
@@ -71,7 +71,7 @@ public JSONObject serializeDocument(final Document document) {
7171 switch (value ) {
7272 case null -> value = JSONObject .NULL ;
7373 case Document document1 -> value = serializeDocument (document1 );
74- case Collection <?> collection -> serializeCollection (database , collection );
74+ case Collection <?> collection -> serializeCollection (database , collection , null );
7575 case Map map -> value = serializeMap (database , (Map <Object , Object >) map );
7676 default -> {
7777 }
@@ -88,8 +88,7 @@ public JSONObject serializeDocument(final Document document) {
8888 }
8989
9090 public JSONObject serializeResult (final Database database , final Result result ) {
91- final JSONObject object = new JSONObject ()
92- .setDateFormat (database .getSchema ().getDateFormat ())
91+ final JSONObject object = new JSONObject ().setDateFormat (database .getSchema ().getDateFormat ())
9392 .setDateTimeFormat (database .getSchema ().getDateTimeFormat ());
9493
9594 DocumentType type = null ;
@@ -118,61 +117,47 @@ else if (value != null)
118117 propertyType = null ;
119118
120119 if (propertyType != null ) {
121- if (propertyTypes .length () > 0 )
120+ if (! propertyTypes .isEmpty () )
122121 propertyTypes .append ("," );
123122 propertyTypes .append (propertyName ).append (":" ).append (propertyType .getId ());
124123 }
125124
126- if (value == null )
127- value = JSONObject .NULL ;
128- else if (value instanceof Document document )
129- value = serializeDocument (document );
130- else if (value instanceof Result res )
131- value = serializeResult (database , res );
132- else if (value instanceof Collection <?> coll )
133- value = serializeCollection (database , coll );
134- else if (value instanceof Map )
135- value = serializeMap (database , (Map <Object , Object >) value );
136- else if (value .getClass ().isArray ())
137- value = serializeCollection (database , List .of ((Object []) value ));
138-
139- value = convertNonNumbers (value );
125+ value = serializeObject (database , value );
140126
141127 object .put (propertyName , value );
142128 }
143129
144130 return object ;
145131 }
146132
147- private Object serializeCollection (final Database database , final Collection <?> value ) {
133+ private Object serializeCollection (final Database database , final Collection <?> value , Class <? extends Document > entryType ) {
148134 Object result = value ;
149- if (!value .isEmpty ()) {
150- if (useCollectionSizeForEdges && value .iterator ().next () instanceof Edge )
151- result = value .size ();
152- else if (useCollectionSize ) {
135+ if (useCollectionSize ) {
136+ result = value .size ();
137+ } else {
138+ if (useCollectionSizeForEdges && //
139+ ((entryType != null && entryType .isAssignableFrom (Edge .class )) || //
140+ value .iterator ().next () instanceof Edge ))
153141 result = value .size ();
154- } else {
142+ else {
155143 final JSONArray list = new JSONArray ();
156- for (Object o : value ) {
157- if (o instanceof Document document )
158- o = serializeDocument (document );
159- else if (o instanceof Result result1 )
160- o = serializeResult (database , result1 );
161- else if (o instanceof ResultSet set )
162- o = serializeResultSet (database , set );
163- else if (o instanceof Collection <?> collection )
164- o = serializeCollection (database , collection );
165- else if (o instanceof Map )
166- o = serializeMap (database , (Map <Object , Object >) o );
167-
168- list .put (o );
169- }
144+ for (Object o : value )
145+ list .put (serializeObject (database , o ));
146+
170147 result = list ;
171148 }
172149 }
173150 return result ;
174151 }
175152
153+ private Object serializeIterator (final Database database , final Iterator <?> value , final Class <? extends Document > entryType ) {
154+ final List <Object > list = new ArrayList <>();
155+ while (value .hasNext ())
156+ list .add (value .next ());
157+
158+ return serializeCollection (database , list , entryType );
159+ }
160+
176161 private Object serializeResultSet (final Database database , final ResultSet resultSet ) {
177162 final JSONArray array = new JSONArray ();
178163 while (resultSet .hasNext ()) {
@@ -187,21 +172,10 @@ private Object serializeMap(final Database database, final Map<Object, Object> v
187172 if (useCollectionSize ) {
188173 result = value .size ();
189174 } else {
190- final JSONObject map = new JSONObject ()
191- .setDateFormat (database .getSchema ().getDateFormat ())
175+ final JSONObject map = new JSONObject ().setDateFormat (database .getSchema ().getDateFormat ())
192176 .setDateTimeFormat (database .getSchema ().getDateTimeFormat ());
193177 for (final Map .Entry <Object , Object > entry : value .entrySet ()) {
194- Object o = entry .getValue ();
195- if (o instanceof Document document )
196- o = serializeDocument (document );
197- else if (o instanceof ResultSet set )
198- o = serializeResultSet (database , set );
199- else if (o instanceof Result result1 )
200- o = serializeResult (database , result1 );
201- else if (o instanceof Collection <?> collection )
202- o = serializeCollection (database , collection );
203- else if (o instanceof Map )
204- o = serializeMap (database , (Map <Object , Object >) o );
178+ final Object o = serializeObject (database , entry .getValue ());
205179 map .put (entry .getKey ().toString (), o );
206180 }
207181 result = map ;
@@ -299,4 +273,31 @@ else if (value.equals(Double.NEGATIVE_INFINITY) || value.equals(Float.NEGATIVE_I
299273 value = "NegInfinity" ;
300274 return value ;
301275 }
276+
277+ private Object serializeObject (final Database database , Object value ) {
278+ if (value == null )
279+ value = JSONObject .NULL ;
280+ else if (value instanceof Document document )
281+ value = serializeDocument (document );
282+ else if (value instanceof Result res )
283+ value = serializeResult (database , res );
284+ else if (value instanceof ResultSet res )
285+ value = serializeResultSet (database , res );
286+ else if (value instanceof Collection <?> coll )
287+ value = serializeCollection (database , coll , null );
288+ else if (value instanceof IterableGraph <?> iter )
289+ value = serializeIterator (database , iter .iterator (), iter .getEntryType ());
290+ else if (value instanceof Iterable <?> iter )
291+ value = serializeIterator (database , iter .iterator (), null );
292+ else if (value instanceof Iterator <?> iter )
293+ value = serializeIterator (database , iter , null );
294+ else if (value instanceof Map )
295+ value = serializeMap (database , (Map <Object , Object >) value );
296+ else if (value .getClass ().isArray ())
297+ value = serializeCollection (database , List .of ((Object []) value ), null );
298+
299+ value = convertNonNumbers (value );
300+
301+ return value ;
302+ }
302303}
0 commit comments