public PaEntry GetFirstByKey(Tkey key) { if (table.Count() == 0) { return(PaEntry.Empty); } return(GetFirstFromByKey(index_cell, key)); }
public PaEntry GetFirstByKey(TKey key) { if (table.Count() == 0) { return(PaEntry.Empty); } var ent = GetFirstFromByKey(indexCellSmall, key); // сначала из маленького массива return(!ent.IsEmpty ? ent : GetFirstFromByKey(indexCell, key)); }
public PaEntry GetFirst(Func <PaEntry, int> elementDepth) { if (table.Count() == 0) { return(new PaEntry(null, Int64.MinValue, null)); } PaEntry entry = table.Element(0); PaEntry entry_in_index = index_cell.Root.BinarySearchFirst(ent => { long off = (long)ent.Get(); entry.offset = off; return(elementDepth(entry)); }); if (entry_in_index.offset == Int64.MinValue) { return(entry_in_index); // не найден } entry.offset = (long)entry_in_index.Get(); return(entry); }
// Сортировка по дополнительному индексу. Предполагается, что по первичному индексу сортировка уже произведена public void AdditionalIndex(int second_field) { long start = 0; object current_prime_value = null; if (table.Count() == 0) { return; } PaEntry tab_entry = table.Element(0); // Нулевой элемент таблицы PType second_type = tab_entry.Field(second_field).Type; long llen = index_cell.Root.Count(); if (llen == 0) { return; } PaEntry ent = index_cell.Root.Element(0); PType tel = ent.Type; int size = tel.HeadSize; long offset = ent.offset; for (long ii = 0; ii < llen; ii++) { ent.offset = offset; offset += size; long tab_offset = (long)ent.Get(); tab_entry.offset = tab_offset; object prime_value = tab_entry.Field(i_field).Get(); int cmp; if (current_prime_value == null) { current_prime_value = prime_value; start = ii; } else if ((cmp = ((IComparable)prime_value).CompareTo(current_prime_value)) != 0 || ii == llen - 1) // Смена значения первичного ключа { long number = ii - start + (cmp == 0 && ii == llen - 1? 1 : 0); if (number > 1) { // нужно сделать сортировку по вторичному ключу index_cell.Root.SortByKey <string>(start, number, (object v) => { tab_entry.offset = (long)v; return((string)tab_entry.Field(second_field).Get()); }, null); // Дефолтный компаратор??? } current_prime_value = prime_value; start = ii; } } }
public PaEntry GetFirstByKey(Tkey key) { if (table.Count() == 0) { return(PaEntry.Empty); } var ent = GetFirstFromByKey(index_cell_small, key); // сначала из маленького массива if (!ent.IsEmpty) { return(ent); } return(GetFirstFromByKey(index_cell, key)); }
// Возвращает первый вход опорной таблицы, для которого сгенерированный ключ совпадает с образцом public PaEntry GetFirstByKey0(Tkey key) { if (table.Count() == 0) { return(PaEntry.Empty); } PaEntry entry = table.Element(0); var candidate = index_cell.Root.BinarySearchFirst(ent => { long off = (long)ent.Get(); entry.offset = off; return(((IComparable)keyProducer(entry)).CompareTo(key)); }); if (candidate.IsEmpty) { return(PaEntry.Empty); } entry.offset = (long)candidate.Get(); return(entry); }