Skip to content

Commit 5949538

Browse files
authored
[variant] Introduce assemble shredded variant struct function (#6652)
1 parent 9a087f6 commit 5949538

File tree

12 files changed

+1492
-103
lines changed

12 files changed

+1492
-103
lines changed

LICENSE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ paimon-format/test/main/java/org/apache/paimon/format/parquet/newReader/DeltaLen
295295
paimon-common/src/main/java/org/apache/paimon/data/variant/ShreddingUtils.java
296296
paimon-common/src/main/java/org/apache/paimon/data/variant/VariantSchema.java
297297
paimon-common/src/main/java/org/apache/paimon/data/variant/VariantShreddingWriter.java
298+
paimon-common/src/main/java/org/apache/paimon/data/variant/BaseVariantReader.java
298299
from https://spark.apache.org/ version 4.0.0-preview2
299300

300301
MIT License

paimon-common/src/main/java/org/apache/paimon/data/variant/BaseVariantReader.java

Lines changed: 519 additions & 0 deletions
Large diffs are not rendered by default.

paimon-common/src/main/java/org/apache/paimon/data/variant/GenericVariant.java

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818

1919
package 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+
2125
import org.apache.paimon.shade.jackson2.com.fasterxml.jackson.core.JsonFactory;
2226
import 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

Comments
 (0)