internal override List <RawRecord> CrossApply(RawRecord record) { List <RawRecord> results = new List <RawRecord>(); FieldObject unfoldTarget = getUnfoldTargetFunc.Evaluate(record); if (unfoldTarget is PathField) { PathField path = (PathField)unfoldTarget; foreach (PathStepField pathStep in path.Path.Cast <PathStepField>()) { if (pathStep == null) { continue; } RawRecord flatRecord = new RawRecord(); Compose1Field compose1StepField = pathStep.StepFieldObject as Compose1Field; Debug.Assert(compose1StepField != null, "compose1StepField != null"); // // Extract only needed columns from Compose1Field // foreach (string unfoldColumn in populateColumns) { flatRecord.Append(compose1StepField[unfoldColumn]); } results.Add(flatRecord); } } else if (unfoldTarget is CollectionField) { CollectionField inputCollection = (CollectionField)unfoldTarget; foreach (FieldObject singleObj in inputCollection.Collection) { if (singleObj == null) { continue; } RawRecord flatRecord = new RawRecord(); Compose1Field compose1ObjField = singleObj as Compose1Field; Debug.Assert(compose1ObjField != null, "compose1ObjField != null"); // // Extract only needed columns from Compose1Field // foreach (string unfoldColumn in populateColumns) { flatRecord.Append(compose1ObjField[unfoldColumn]); } results.Add(flatRecord); } } else if (unfoldTarget is MapField) { MapField inputMap = (MapField)unfoldTarget; foreach (EntryField entry in inputMap) { RawRecord entryRecord = new RawRecord(); foreach (string columnName in this.populateColumns) { entryRecord.Append(columnName.Equals(GraphViewKeywords.KW_TABLE_DEFAULT_COLUMN_NAME) ? entry : (FieldObject)null); } results.Add(entryRecord); } } else { RawRecord flatRecord = unfoldTarget.FlatToRawRecord(this.populateColumns); results.Add(flatRecord); } return(results); }