@@ -30,7 +30,7 @@ def compact(element, property: nil)
3030 # If element has a single member and the active property has no
3131 # @container mapping to @list or @set, the compacted value is that
3232 # member; otherwise the compacted value is element
33- if result . length == 1 && context . container ( property ) . nil? && @options [ :compactArrays ]
33+ if result . length == 1 && ! context . as_array? ( property ) && @options [ :compactArrays ]
3434 #log_debug("=> extract single element: #{result.first.inspect}")
3535 result . first
3636 else
@@ -85,7 +85,7 @@ def compact(element, property: nil)
8585 compacted_value . each do |prop , value |
8686 if context . reverse? ( prop )
8787 value = [ value ] if !value . is_a? ( Array ) &&
88- ( context . container ( prop ) == '@set' || !@options [ :compactArrays ] )
88+ ( context . as_array? ( prop ) || !@options [ :compactArrays ] )
8989 #log_debug("") {"merge #{prop} => #{value.inspect}"}
9090
9191 merge_compacted_value ( result , prop , value )
@@ -101,6 +101,17 @@ def compact(element, property: nil)
101101 next
102102 end
103103
104+ if expanded_property == '@preserve'
105+ # Compact using `property`
106+ compacted_value = compact ( expanded_value , property : property )
107+ #log_debug("@preserve") {"compacted_value: #{compacted_value.inspect}"}
108+
109+ unless compacted_value . is_a? ( Array ) && compacted_value . empty?
110+ result [ '@preserve' ] = compacted_value
111+ end
112+ next
113+ end
114+
104115 if expanded_property == '@index' && context . container ( property ) == '@index'
105116 #log_debug("@index") {"drop @index"}
106117 next
@@ -150,6 +161,7 @@ def compact(element, property: nil)
150161 end
151162
152163 container = context . container ( item_active_property )
164+ as_array = context . as_array? ( item_active_property )
153165 value = list? ( expanded_item ) ? expanded_item [ '@list' ] : expanded_item
154166 compacted_item = compact ( value , property : item_active_property )
155167 #log_debug("") {" => compacted key: #{item_active_property.inspect} for #{compacted_item.inspect}"}
@@ -195,14 +207,11 @@ def compact(element, property: nil)
195207 end
196208 compacted_item
197209 end
210+ compacted_item = [ compacted_item ] if as_array && !compacted_item . is_a? ( Array )
198211 merge_compacted_value ( map_object , map_key , compacted_item )
199212 else
200213 compacted_item = [ compacted_item ] if
201- !compacted_item . is_a? ( Array ) && (
202- !@options [ :compactArrays ] ||
203- %w( @set @list ) . include? ( container ) ||
204- %w( @list @graph ) . include? ( expanded_property )
205- )
214+ !compacted_item . is_a? ( Array ) && ( !@options [ :compactArrays ] || as_array )
206215 merge_compacted_value ( nest_result , item_active_property , compacted_item )
207216 end
208217 end
0 commit comments