private static List<UnionDataSchema.Member> removeAlreadyTraversedSchemasFromUnionMemberList(ParentSchemas parentSchemas, List<UnionDataSchema.Member> unionMembers) { final List<UnionDataSchema.Member> copy = unionMembers.stream().filter(member -> !parentSchemas.contains(member.getType())).collect(Collectors.toList()); if(copy.isEmpty()) return unionMembers; // eek, cannot safely filter out already traversed schemas, this code path will likely result in IllegalArgumentException being thrown from preventRecursionIntoAlreadyTraversedSchemas (which is the correct way to handle this). else return copy; }
/** * Returns the {@link DataSchema} for a member identified by its member key returned * from {@link Member#getUnionMemberKey()}. * * @param memberKey Union member key of the member. * @return the {@link DataSchema} if type is a member of the union, else return null. */ public DataSchema getTypeByMemberKey(String memberKey) { Integer index = _memberKeyToIndexMap.get(memberKey); return (index != null ? _members.get(index).getType() : null); }
for (Member member: members) DataSchema memberType = member.getType();
final int unionIndex = _random.nextInt(members.size()); final UnionDataSchema.Member unionMember = members.get(unionIndex); data = buildData(parentSchemas, unionMember.getType(), fieldName, spec);
for (UnionDataSchema.Member member : unionSchema.getMembers()) computeImports(member.getType(), member.isDeclaredInline(), importsAcc);
for (UnionDataSchema.Member member : unionDataSchema.getMembers()) traverseChild(member.getUnionMemberKey(), member.getType());
DataSchema memberSchema = members.get(0).getType(); assert(_recursive); validate(element, memberSchema, object);
for(UnionDataSchema.Member member : unionSchema.getMembers()) recordType(member.getType(), foundTypes, typeOrder);
DataSchema newerSchema = newerMember.getType(); DataSchema olderSchema = older.getTypeByMemberKey(newerMember.getUnionMemberKey());
if (memberDataSchema != unionDataSchema.getMembers().get(0).getType())
/** * Encode a specific {@link com.linkedin.data.schema.UnionDataSchema.Member} of a union. * * @param member The specific union member that needs to be encoded. * @throws IOException if there is an error while encoding. */ protected void encodeUnionMember(UnionDataSchema.Member member) throws IOException { if (member.hasAlias()) { _builder.writeStartObject(); // alias _builder.writeStringField(ALIAS_KEY, member.getAlias(), true); // type _builder.writeFieldName(TYPE_KEY); encode(member.getType(), member.isDeclaredInline()); // doc _builder.writeStringField(DOC_KEY, member.getDoc(), false); // properties _builder.writeProperties(member.getProperties()); _builder.writeEndObject(); } else { // for member without aliases, encode the type encode(member.getType(), member.isDeclaredInline()); } }
@Override protected Object translateUnion(List<Object> path, Object value, UnionDataSchema unionDataSchema) { Object result; if (value == Data.NULL) { result = value; } else { // member type is always the 1st member of the union. UnionDataSchema.Member member = unionDataSchema.getMembers().get(0); result = unionDefaultValue(member, value); path.add(member.getUnionMemberKey()); translate(path, value, member.getType()); path.remove(path.size() - 1); } return result; }
private void writeUnion(UnionDataSchema schema) throws IOException { write("union["); for(Iterator<UnionDataSchema.Member> iter = schema.getMembers().iterator(); iter.hasNext();) { UnionDataSchema.Member member = iter.next(); writeReferenceOrInline(member.getType(), member.isDeclaredInline()); if (iter.hasNext()) { write(", "); } } write("]"); }