Skip to content

Commit

Permalink
Fix cast from json to nested row or map
Browse files Browse the repository at this point in the history
  • Loading branch information
haozhun committed Nov 24, 2015
1 parent f477cea commit 8fde846
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 7 deletions.
1 change: 1 addition & 0 deletions presto-docs/src/main/sphinx/release.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Release Notes
.. toctree::
:maxdepth: 1

release/release-0.128
release/release-0.127
release/release-0.126
release/release-0.125
Expand Down
9 changes: 9 additions & 0 deletions presto-docs/src/main/sphinx/release/release-0.128.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
=============
Release 0.128
=============

General Changes
---------------

* Fix cast from json to structural types when rows or maps have arrays,
rows, or maps nested in them.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import com.facebook.presto.spi.ConnectorSession;
import com.facebook.presto.spi.block.BlockBuilder;
import com.facebook.presto.spi.block.BlockBuilderStatus;
import com.facebook.presto.spi.block.VariableWidthBlockBuilder;
import com.facebook.presto.spi.type.FixedWidthType;
import com.facebook.presto.spi.type.StandardTypes;
import com.facebook.presto.spi.type.Type;
Expand Down Expand Up @@ -220,28 +219,28 @@ public static void appendToBlockBuilder(Type type, Object element, BlockBuilder
blockBuilder.appendNull();
}
else if (type.getTypeSignature().getBase().equals(StandardTypes.ARRAY) && element instanceof Iterable<?>) {
BlockBuilder subBlockBuilder = ((ArrayType) type).getElementType().createBlockBuilder(new BlockBuilderStatus(), TypeUtils.EXPECTED_ARRAY_SIZE);
BlockBuilder subBlockBuilder = blockBuilder.beginBlockEntry();
for (Object subElement : (Iterable<?>) element) {
appendToBlockBuilder(type.getTypeParameters().get(0), subElement, subBlockBuilder);
}
type.writeObject(blockBuilder, subBlockBuilder);
blockBuilder.closeEntry();
}
else if (type.getTypeSignature().getBase().equals(StandardTypes.ROW) && element instanceof Iterable<?>) {
BlockBuilder subBlockBuilder = new VariableWidthBlockBuilder(new BlockBuilderStatus(), TypeUtils.EXPECTED_ARRAY_SIZE);
BlockBuilder subBlockBuilder = blockBuilder.beginBlockEntry();
int field = 0;
for (Object subElement : (Iterable<?>) element) {
appendToBlockBuilder(type.getTypeParameters().get(field), subElement, subBlockBuilder);
field++;
}
type.writeObject(blockBuilder, subBlockBuilder);
blockBuilder.closeEntry();
}
else if (type.getTypeSignature().getBase().equals(StandardTypes.MAP) && element instanceof Map<?, ?>) {
BlockBuilder subBlockBuilder = new VariableWidthBlockBuilder(new BlockBuilderStatus(), TypeUtils.EXPECTED_ARRAY_SIZE);
BlockBuilder subBlockBuilder = blockBuilder.beginBlockEntry();
for (Map.Entry<?, ?> entry : ((Map<?, ?>) element).entrySet()) {
appendToBlockBuilder(type.getTypeParameters().get(0), entry.getKey(), subBlockBuilder);
appendToBlockBuilder(type.getTypeParameters().get(1), entry.getValue(), subBlockBuilder);
}
type.writeObject(blockBuilder, subBlockBuilder);
blockBuilder.closeEntry();
}

else if (javaType == boolean.class) {
Expand Down

0 comments on commit 8fde846

Please sign in to comment.