using System; using System.Collections.Generic; using System.Linq; namespace OpenTap { class ResultTableOptimizer { /// /// Tables can be merged if they have the same name, and the same count, types and names of columns. /// public static bool CanMerge(ResultTable table1, ResultTable table2) { if (table2.Name != table1.Name) return false; if (table2.Columns.Length != table1.Columns.Length) return false; var count = table1.Columns.Length; for (var columnIdx = 0; columnIdx < count; columnIdx++) { var c1 = table1.Columns[columnIdx]; var c2 = table2.Columns[columnIdx]; if (c1.Name != c2.Name || c1.ObjectType != c2.ObjectType) return false; if (c1.TypeCode != c2.TypeCode) return false; if (!c1.Parameters.SequenceEqual(c2.Parameters)) return false; } return true; } /// Merges a set of result tables. This assumes that CanMerge has been called and returned true for all elements in the list. public static ResultTable MergeTables(IReadOnlyList tables) { int columnSize = tables.Sum(x => x.Rows); var columns = tables[0].Columns.Select((v, i) => { var elem = v.Data.GetType().GetElementType(); int offset = 0; var newA = Array.CreateInstance(elem, columnSize); for (var j = 0; j < tables.Count; j++) { var newData = tables[j].Columns[i].Data; newData.CopyTo(newA, offset); offset += newData.Length; } return new ResultColumn(v.Name, newA); }).ToArray(); return new ResultTable(tables[0].Name, columns); } } }