Skip to content

Commit 4d88ecf

Browse files
authored
[FLINK-39084][core] variant accessor methods for handling map or array types in converters
1 parent 73fe043 commit 4d88ecf

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

flink-core/src/main/java/org/apache/flink/types/variant/BinaryVariant.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232
import java.time.ZoneId;
3333
import java.time.ZoneOffset;
3434
import java.time.temporal.ChronoUnit;
35+
import java.util.ArrayList;
3536
import java.util.Arrays;
3637
import java.util.Base64;
38+
import java.util.List;
3739
import java.util.Objects;
3840

3941
import static org.apache.flink.types.variant.BinaryVariantUtil.BINARY_SEARCH_THRESHOLD;
@@ -242,11 +244,32 @@ public Variant getElement(int index) throws VariantTypeException {
242244
return getElementAtIndex(index);
243245
}
244246

247+
@Override
248+
public int getArraySize() throws VariantTypeException {
249+
return handleArray(value, pos, (size, offsetSize, offsetStart, dataStart) -> size);
250+
}
251+
245252
@Override
246253
public Variant getField(String fieldName) throws VariantTypeException {
247254
return getFieldByKey(fieldName);
248255
}
249256

257+
@Override
258+
public List<String> getFieldNames() throws VariantTypeException {
259+
return handleObject(
260+
value,
261+
pos,
262+
(size, idSize, offsetSize, idStart, offsetStart, dataStart) -> {
263+
List<String> fieldNames = new ArrayList<>(size);
264+
for (int i = 0; i < size; i++) {
265+
int id = readUnsigned(value, idStart + idSize * i, idSize);
266+
String fieldName = getMetadataKey(metadata, id);
267+
fieldNames.add(fieldName);
268+
}
269+
return fieldNames;
270+
});
271+
}
272+
250273
@Override
251274
public String toJson() {
252275
StringBuilder sb = new StringBuilder();

flink-core/src/main/java/org/apache/flink/types/variant/Variant.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.time.Instant;
2525
import java.time.LocalDate;
2626
import java.time.LocalDateTime;
27+
import java.util.List;
2728

2829
/** Variant represent a semi-structured data. */
2930
@PublicEvolving
@@ -175,6 +176,14 @@ public interface Variant {
175176
*/
176177
Variant getElement(int index) throws VariantTypeException;
177178

179+
/**
180+
* Get the size of an array variant.
181+
*
182+
* @return Number of elements if this variant is an array
183+
* @throws VariantTypeException If this variant is not an array.
184+
*/
185+
int getArraySize() throws VariantTypeException;
186+
178187
/**
179188
* Access value of the specified field of an object variant. If there is no field with the
180189
* specified name, null is returned.
@@ -186,6 +195,15 @@ public interface Variant {
186195
*/
187196
Variant getField(String fieldName) throws VariantTypeException;
188197

198+
/**
199+
* Get the field names of an object variant only at top level. Doesn't include the nested
200+
* fields.
201+
*
202+
* @return List of field names if this variant is an object
203+
* @throws VariantTypeException If this variant is not an object.
204+
*/
205+
List<String> getFieldNames() throws VariantTypeException;
206+
189207
/** Parses the variant to json. */
190208
String toJson();
191209

flink-core/src/test/java/org/apache/flink/types/variant/BinaryVariantTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ void testArrayVariant() {
113113
assertThat(variant.isPrimitive()).isFalse();
114114
assertThat(variant.isObject()).isFalse();
115115
assertThat(variant.getType()).isEqualTo(Variant.Type.ARRAY);
116+
assertThat(variant.getArraySize()).isEqualTo(5);
116117

117118
assertThat(variant.getElement(-1)).isNull();
118119
assertThat(variant.getElement(0).getInt()).isEqualTo(1);
@@ -144,12 +145,16 @@ void testObjectVariant() {
144145
assertThat(variant.isPrimitive()).isFalse();
145146
assertThat(variant.isObject()).isTrue();
146147
assertThat(variant.getType()).isEqualTo(Variant.Type.OBJECT);
148+
assertThat(variant.getFieldNames()).containsExactlyInAnyOrder("list", "object", "bb");
147149

148150
assertThat(variant.getField("list").isArray()).isTrue();
151+
assertThat(variant.getField("list").getArraySize()).isEqualTo(2);
149152
assertThat(variant.getField("list").getElement(0).getString()).isEqualTo("hello");
150153
assertThat(variant.getField("list").getElement(1).getInt()).isEqualTo(1);
151154

152155
assertThat(variant.getField("object").isObject()).isTrue();
156+
assertThat(variant.getField("object").getFieldNames())
157+
.containsExactlyInAnyOrder("ss", "ff");
153158
assertThat(variant.getField("object").getField("ss").getShort()).isEqualTo((short) 1);
154159
assertThat(variant.getField("object").getField("ff").getFloat()).isEqualTo((10.0f));
155160

0 commit comments

Comments
 (0)