private int[] SortTable <T>(MetadataTable <T> table, IComparer <int> comparer) where T : struct { int count = table.Count; // Create rids int[] indexes = new int[count]; for (int i = 0; i < count; i++) { indexes[i] = i; } // Sort rids. Array.Sort <int>(indexes, 0, count, comparer); var oldRows = table.GetRows(); var newRows = new T[count]; int[] ridMap = new int[count]; // Map for (int i = 0; i < count; i++) { int mapIndex = indexes[i]; ridMap[mapIndex] = i + 1; newRows[i] = oldRows[mapIndex]; } table.SetRows(newRows); return(ridMap); }
private int GetTableRowSize(MetadataTable table) { var tableSchema = table.GetSchema(); var columnSchemas = tableSchema.Columns; int columnOffset = 0; for (int columnIndex = 0; columnIndex < columnSchemas.Length; columnIndex++) { int columnSize; var columnSchema = columnSchemas[columnIndex]; if (columnSchema.IsTableIndex) { columnSize = (_compressionInfo.TableRowIndexSize4[columnSchema.Type] ? 4 : 2); } else if (columnSchema.IsCodedToken) { columnSize = (_compressionInfo.CodedTokenDataSize4[columnSchema.Type - 64] ? 4 : 2); } else { switch (columnSchema.Type) { case MetadataColumnType.Byte2: case MetadataColumnType.Int16: case MetadataColumnType.UInt16: columnSize = 2; break; case MetadataColumnType.Int32: case MetadataColumnType.UInt32: columnSize = 4; break; case MetadataColumnType.String: columnSize = (_compressionInfo.StringHeapOffsetSize4 ? 4 : 2); break; case MetadataColumnType.Guid: columnSize = (_compressionInfo.GuidHeapOffsetSize4 ? 4 : 2); break; case MetadataColumnType.Blob: columnSize = (_compressionInfo.BlobHeapOffsetSize4 ? 4 : 2); break; default: throw new InvalidOperationException(); } } columnOffset += columnSize; } return(columnOffset); }
private bool CanSortAndMark(MetadataTable table) { if (IsSorted(table.Type)) { return(false); } SetSorted(table.Type, true); if (table.Count == 0) { return(false); } return(true); }
private void DeoptimizeTable <T>(MetadataTable <T> table, MetadataPtrTable ptrTable) where T : struct { int count = table.Count; if (count == 0) { return; } ptrTable.Capacity = count; for (int i = 0; i < count; i++) { ptrTable.Add(i + 1); } }
private void OptimizeTable <T>(MetadataTable <T> table, MetadataPtrTable ptrTable) where T : struct { int count = table.Count; if (count == 0) { return; } if (ptrTable.Count == 0) { return; } int[] rids = new int[count]; for (int i = 0; i < count; i++) { rids[i] = ptrTable.Get(i + 1); } table.Map(rids); ptrTable.Clear(); }