1818
1919package org .apache .paimon .data .variant ;
2020
21+ import org .apache .paimon .data .variant .VariantPathSegment .ArrayExtraction ;
22+ import org .apache .paimon .data .variant .VariantPathSegment .ObjectExtraction ;
23+ import org .apache .paimon .types .DataType ;
24+
2125import org .apache .paimon .shade .jackson2 .com .fasterxml .jackson .core .JsonFactory ;
2226import org .apache .paimon .shade .jackson2 .com .fasterxml .jackson .core .JsonGenerator ;
2327
@@ -134,13 +138,9 @@ public static GenericVariant fromJson(String json) {
134138 }
135139 }
136140
137- @ Override
138- public String toJson () {
139- return toJson (ZoneOffset .UTC );
140- }
141-
142141 // Stringify the variant in JSON format.
143142 // Throw `MALFORMED_VARIANT` if the variant is malformed.
143+ @ Override
144144 public String toJson (ZoneId zoneId ) {
145145 StringBuilder sb = new StringBuilder ();
146146 toJsonImpl (value , metadata , pos , sb , zoneId );
@@ -152,39 +152,19 @@ public String toString() {
152152 return toJson ();
153153 }
154154
155- public Object variantGet (String path ) {
155+ public Object variantGet (String path , DataType dataType , VariantCastArgs castArgs ) {
156156 GenericVariant v = this ;
157- PathSegment [] parsedPath = PathSegment .parse (path );
158- for (PathSegment pathSegment : parsedPath ) {
159- if (pathSegment . isKey () && v .getType () == Type .OBJECT ) {
160- v = v .getFieldByKey (pathSegment .getKey ());
161- } else if (pathSegment . isIndex () && v .getType () == Type .ARRAY ) {
162- v = v .getElementAtIndex (pathSegment .getIndex ());
157+ VariantPathSegment [] parsedPath = VariantPathSegment .parse (path );
158+ for (VariantPathSegment pathSegment : parsedPath ) {
159+ if (pathSegment instanceof ObjectExtraction && v .getType () == Type .OBJECT ) {
160+ v = v .getFieldByKey ((( ObjectExtraction ) pathSegment ) .getKey ());
161+ } else if (pathSegment instanceof ArrayExtraction && v .getType () == Type .ARRAY ) {
162+ v = v .getElementAtIndex ((( ArrayExtraction ) pathSegment ) .getIndex ());
163163 } else {
164164 return null ;
165165 }
166166 }
167-
168- switch (v .getType ()) {
169- case OBJECT :
170- case ARRAY :
171- return v .toJson ();
172- case STRING :
173- return v .getString ();
174- case LONG :
175- return v .getLong ();
176- case DOUBLE :
177- return v .getDouble ();
178- case DECIMAL :
179- return v .getDecimal ();
180- case BOOLEAN :
181- return v .getBoolean ();
182- case NULL :
183- return null ;
184- default :
185- // todo: support other types
186- throw new IllegalArgumentException ("Unsupported type: " + v .getType ());
187- }
167+ return VariantGet .cast (v , dataType , castArgs );
188168 }
189169
190170 @ Override
0 commit comments