for (LogicalSchema.LogicalFieldSchema fs : mUserDefinedSchema.get(i).getFields()) {
mUserDefinedSchemaCopy.addField(fs.deepCopy());
}
}
LogicalFieldSchema fieldSchema = null;
// schema of the expression after flatten
LogicalSchema expSchema = null;
if (exp.getFieldSchema()!=null) {
fieldSchema = exp.getFieldSchema().deepCopy();
expSchema = new LogicalSchema();
if ((fieldSchema.type != DataType.TUPLE && fieldSchema.type != DataType.BAG)||!flattenFlags[i]) {
// if type is primitive, just add to schema
if (fieldSchema!=null)
expSchema.addField(fieldSchema);
else
expSchema = null;
} else {
// if bag/tuple don't have inner schema, after flatten, we don't have schema for the entire operator
if (fieldSchema.schema==null) {
expSchema = null;
}
else {
// if we come here, we get a BAG/Tuple with flatten, extract inner schema of the tuple as expSchema
List<LogicalSchema.LogicalFieldSchema> innerFieldSchemas = new ArrayList<LogicalSchema.LogicalFieldSchema>();
if (flattenFlags[i]) {
if (fieldSchema.type == DataType.BAG) {
// if it is bag, get the schema of tuples
if (fieldSchema.schema!=null) {
if (fieldSchema.schema.getField(0).schema!=null)
innerFieldSchemas = fieldSchema.schema.getField(0).schema.getFields();
for (LogicalSchema.LogicalFieldSchema fs : innerFieldSchemas) {
fs.alias = fs.alias == null ? null : fieldSchema.alias + "::" + fs.alias;
}
}
} else { // DataType.TUPLE
innerFieldSchemas = fieldSchema.schema.getFields();
for (LogicalSchema.LogicalFieldSchema fs : innerFieldSchemas) {
fs.alias = fs.alias == null ? null : fieldSchema.alias + "::" + fs.alias;
}
}
for (LogicalSchema.LogicalFieldSchema fs : innerFieldSchemas)
expSchema.addField(fs);
}
else
expSchema.addField(fieldSchema);
}
}
}
// Merge with user defined schema
if (expSchema!=null && expSchema.size()==0)
expSchema = null;
LogicalSchema planSchema = new LogicalSchema();
if (mUserDefinedSchemaCopy!=null) {
LogicalSchema mergedSchema = new LogicalSchema();
// merge with userDefinedSchema
if (expSchema==null) {
// Use user defined schema
for (LogicalFieldSchema fs : mUserDefinedSchemaCopy.getFields()) {
fs.stampFieldSchema();
mergedSchema.addField(new LogicalFieldSchema(fs));
}
if(mergedSchema.size() == 1 && mergedSchema.getField(0).type == DataType.NULL){
//this is the use case where a new alias has been specified by user
mergedSchema.getField(0).type = DataType.BYTEARRAY;
}