private Block[] getBlocksForType(Type type, int positionCount) throws IOException { RowType rowType = (RowType) type; Block[] blocks = new Block[rowType.getFields().size()]; for (int i = 0; i < rowType.getFields().size(); i++) { Optional<String> fieldName = rowType.getFields().get(i).getName(); Type fieldType = rowType.getFields().get(i).getType(); if (!fieldName.isPresent()) { throw new IllegalArgumentException("Missing struct field name in type " + rowType); } String lowerCaseFieldName = fieldName.get().toLowerCase(Locale.ENGLISH); StreamReader streamReader = structFields.get(lowerCaseFieldName); if (streamReader != null) { streamReader.prepareNextRead(positionCount); blocks[i] = streamReader.readBlock(fieldType); } else { blocks[i] = getNullBlock(fieldType, positionCount); } } return blocks; }
private TypeCompatibility typeCompatibilityForRow(RowType firstType, RowType secondType) { List<Field> firstFields = firstType.getFields(); List<Field> secondFields = secondType.getFields(); if (firstFields.size() != secondFields.size()) { return TypeCompatibility.incompatible(); } ImmutableList.Builder<RowType.Field> fields = ImmutableList.builder(); boolean coercible = true; for (int i = 0; i < firstFields.size(); i++) { Type firstFieldType = firstFields.get(i).getType(); Type secondFieldType = secondFields.get(i).getType(); TypeCompatibility typeCompatibility = compatibility(firstFieldType, secondFieldType); if (!typeCompatibility.isCompatible()) { return TypeCompatibility.incompatible(); } Type commonParameterType = typeCompatibility.getCommonSuperType(); Optional<String> firstParameterName = firstFields.get(i).getName(); Optional<String> secondParameterName = secondFields.get(i).getName(); Optional<String> commonName = firstParameterName.equals(secondParameterName) ? firstParameterName : Optional.empty(); // ignore parameter name for coercible coercible &= typeCompatibility.isCoercible(); fields.add(new RowType.Field(commonName, commonParameterType)); } return TypeCompatibility.compatible(RowType.from(fields.build()), coercible); }
if (!SystemSessionProperties.isLegacyUnnest(session) && elementType instanceof RowType) { ImmutableList.Builder<Symbol> unnestSymbolBuilder = ImmutableList.builder(); for (int i = 0; i < ((RowType) elementType).getFields().size(); i++) { unnestSymbolBuilder.add(unnestedSymbolsIterator.next());
@Override public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionRegistry functionRegistry) { checkArgument(arity == 1, "Expected arity to be 1"); RowType rowType = (RowType) boundVariables.getTypeVariable("T"); checkCondition(canCastFromJson(rowType), INVALID_CAST_ARGUMENT, "Cannot cast JSON to %s", rowType); List<Field> rowFields = rowType.getFields(); BlockBuilderAppender[] fieldAppenders = rowFields.stream() .map(rowField -> createBlockBuilderAppender(rowField.getType())) .toArray(BlockBuilderAppender[]::new); MethodHandle methodHandle = METHOD_HANDLE.bindTo(rowType).bindTo(fieldAppenders).bindTo(getFieldNameToIndex(rowFields)); return new ScalarFunctionImplementation( true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle, isDeterministic()); }
@Override protected RowExpression visitDereferenceExpression(DereferenceExpression node, Void context) { RowType rowType = (RowType) getType(node.getBase()); String fieldName = node.getField().getValue(); List<Field> fields = rowType.getFields(); int index = -1; for (int i = 0; i < fields.size(); i++) { Field field = fields.get(i); if (field.getName().isPresent() && field.getName().get().equalsIgnoreCase(fieldName)) { checkArgument(index < 0, "Ambiguous field %s in type %s", field, rowType.getDisplayName()); index = i; } } if (legacyRowFieldOrdinalAccess && index < 0) { OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, fields); if (rowIndex.isPresent()) { index = rowIndex.getAsInt(); } } checkState(index >= 0, "could not find field name: %s", node.getField()); Type returnType = getType(node); return call(dereferenceSignature(returnType, rowType), returnType, process(node.getBase(), context), constant(index, INTEGER)); }
Type elementType = ((ArrayType) expressionType).getElementType(); if (!SystemSessionProperties.isLegacyUnnest(session) && elementType instanceof RowType) { ((RowType) elementType).getFields().stream() .map(field -> Field.newUnqualified(field.getName(), field.getType())) .forEach(outputFields::add);
for (RowType.Field rowField : rowType.getFields()) { if (fieldName.equalsIgnoreCase(rowField.getName().orElse(null))) { rowFieldType = rowField.getType(); OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, rowType.getFields()); if (rowIndex.isPresent()) { rowFieldType = rowType.getFields().get(rowIndex.getAsInt()).getType();
if (!SystemSessionProperties.isLegacyUnnest(session) && elementType instanceof RowType) { ImmutableList.Builder<Symbol> unnestSymbolBuilder = ImmutableList.builder(); for (int i = 0; i < ((RowType) elementType).getFields().size(); i++) { unnestSymbolBuilder.add(unnestedSymbolsIterator.next());
Type returnType = type(node); String fieldName = node.getField().getValue(); List<Field> fields = rowType.getFields(); int index = -1; for (int i = 0; i < fields.size(); i++) {
case StandardTypes.ROW: RowType rowType = (RowType) type; List<Field> rowFields = rowType.getFields(); BlockBuilderAppender[] fieldAppenders = new BlockBuilderAppender[rowFields.size()]; for (int i = 0; i < fieldAppenders.length; i++) {
@Override public List<? extends StdType> fieldTypes() { return rowType.getFields().stream().map(f -> PrestoWrapper.createStdType(f.getType())).collect(Collectors.toList()); }
@Override public List<? extends StdType> fieldTypes() { return rowType.getFields().stream().map(f -> PrestoWrapper.createStdType(f.getType())).collect(Collectors.toList()); }
@Override public List<StdData> fields() { ArrayList<StdData> fields = new ArrayList<>(); for (int i = 0; i < _block.getPositionCount(); i++) { Type elementType = _rowType.getFields().get(i).getType(); Object element = readNativeValue(elementType, _block, i); fields.add(PrestoWrapper.createStdData(element, elementType, _stdFactory)); } return fields; }
@Override public List<StdData> fields() { ArrayList<StdData> fields = new ArrayList<>(); for (int i = 0; i < _block.getPositionCount(); i++) { Type elementType = _rowType.getFields().get(i).getType(); Object element = readNativeValue(elementType, _block, i); fields.add(PrestoWrapper.createStdData(element, elementType, _stdFactory)); } return fields; }
@Override public StdData getField(int index) { int position = PrestoWrapper.checkedIndexToBlockPosition(_block, index); if (position == -1) { return null; } Type elementType = _rowType.getFields().get(position).getType(); Object element = readNativeValue(elementType, _block, position); return PrestoWrapper.createStdData(element, elementType, _stdFactory); }
@Override public StdData getField(int index) { int position = PrestoWrapper.checkedIndexToBlockPosition(_block, index); if (position == -1) { return null; } Type elementType = _rowType.getFields().get(position).getType(); Object element = readNativeValue(elementType, _block, position); return PrestoWrapper.createStdData(element, elementType, _stdFactory); }
@Override public StdData getField(String name) { int index = -1; Type elementType = null; int i = 0; for (RowType.Field field : _rowType.getFields()) { if (field.getName().isPresent() && name.equals(field.getName().get())) { index = i; elementType = field.getType(); break; } i++; } if (index == -1) { return null; } Object element = readNativeValue(elementType, _block, index); return PrestoWrapper.createStdData(element, elementType, _stdFactory); }
@Override public StdData getField(String name) { int index = -1; Type elementType = null; int i = 0; for (RowType.Field field : _rowType.getFields()) { if (field.getName().isPresent() && name.equals(field.getName().get())) { index = i; elementType = field.getType(); break; } i++; } if (index == -1) { return null; } Object element = readNativeValue(elementType, _block, index); return PrestoWrapper.createStdData(element, elementType, _stdFactory); }
@Override public void setField(String name, StdData value) { BlockBuilder mutable = _rowType.createBlockBuilder(new PageBuilderStatus().createBlockBuilderStatus(), 1); BlockBuilder rowBlockBuilder = mutable.beginBlockEntry(); int i = 0; for (RowType.Field field : _rowType.getFields()) { if (field.getName().isPresent() && name.equals(field.getName().get())) { ((PrestoData) value).writeToBlock(rowBlockBuilder); } else { if (_block == null) { rowBlockBuilder.appendNull(); } else { field.getType().appendTo(_block, i, rowBlockBuilder); } } i++; } mutable.closeEntry(); _block = _rowType.getObject(mutable.build(), 0); }
@Override public void setField(String name, StdData value) { BlockBuilder mutable = _rowType.createBlockBuilder(new PageBuilderStatus().createBlockBuilderStatus(), 1); BlockBuilder rowBlockBuilder = mutable.beginBlockEntry(); int i = 0; for (RowType.Field field : _rowType.getFields()) { if (field.getName().isPresent() && name.equals(field.getName().get())) { ((PrestoData) value).writeToBlock(rowBlockBuilder); } else { if (_block == null) { rowBlockBuilder.appendNull(); } else { field.getType().appendTo(_block, i, rowBlockBuilder); } } i++; } mutable.closeEntry(); _block = _rowType.getObject(mutable.build(), 0); }