public void Load() { // Маленький массив будет после загрузки пустым index_cell_small.Clear(); index_cell_small.Fill(new object[0]); index_cell_small.Flush(); index_cell.Clear(); index_cell.Fill(new object[0]); foreach (var rec in table.Elements().Where(ent => (bool)ent.Field(0).Get() == false)) // загрузка всех элементов за исключением уничтоженных { long offset = rec.offset; index_cell.Root.AppendElement(offset); } index_cell.Flush(); if (index_cell.Root.Count() == 0) { return; // потому что следующая операция не пройдет } // Сортировать index_cell специальным образом: значение (long) используется как offset ячейки и там прочитывается нулевое поле var ptr = table.Element(0); //index_cell.Root.SortByKey<Tkey>((object v) => index_cell.Root.SortByKey <Tkey>((object v) => { ptr.offset = (long)v; return(keyProducer(ptr)); }, comparer); }
public void Load() { index_cell.Clear(); index_cell.Fill(new object[0]); foreach (var rec in table.Elements().Where(ent => (bool)ent.Field(0).Get() == false)) { long offset = rec.offset; index_cell.Root.AppendElement(offset); } index_cell.Flush(); if (index_cell.Root.Count() == 0) { return; // потому что следующая операция не пройдет } // Попробую сортировать index_cell специальным образом: значение (long) используется как offset ячейки и там прочитывается нулевое поле var ptr = table.Element(0); if (columnType.Vid == PTypeEnumeration.integer) { index_cell.Root.SortByKey <int>((object v) => { ptr.offset = (long)v; return((int)ptr.Field(i_field).Get()); }); } else if (columnType.Vid == PTypeEnumeration.longinteger) { index_cell.Root.SortByKey <long>((object v) => { ptr.offset = (long)v; return((long)ptr.Field(i_field).Get()); }); } else if (columnType.Vid == PTypeEnumeration.sstring) { index_cell.Root.SortByKey <string>((object v) => { ptr.offset = (long)v; return((string)ptr.Field(i_field).Get()); }); } else if (columnType.Vid == PTypeEnumeration.real) { index_cell.Root.SortByKey <double>((object v) => { ptr.offset = (long)v; return((double)ptr.Field(i_field).Get()); }); } else { throw new Exception("Wrong type of column for indexing"); } }
public void Load(Func <PaEntry, object[][]> genPairs) { intern_cell.Clear(); intern_cell.Fill(new object[0]); foreach (PaEntry rec in table.Elements()) { object[][] pairs = genPairs(rec); foreach (object[] pair in pairs) { intern_cell.Root.AppendElement(new object[] { false, pair[0], pair[1] }); } } intern_cell.Flush(); key_index.Load(); }
public void Load(Func <PaEntry, object[][]> genTriples) { intern_cell.Clear(); intern_cell.Fill(new object[0]); foreach (PaEntry rec in table.Elements()) { object[][] triples = genTriples(rec); foreach (object[] v3 in triples) { intern_cell.Root.AppendElement(new object[] { false, v3[0], v3[1], v3[2], v3[3] }); } } intern_cell.Flush(); key_index.Load(); key_index.AdditionalIndex(3); // дополнительный индекс - предикат //Проставим начала групп обратных ссылок и длину групп long inv_beg = Int64.MinValue, inv_count = Int64.MinValue; // offset начала серии в intern_cell и длина серии PaEntry tab_el_ent = table.Element(0); long key_offset = Int64.MaxValue; // будем фиксировать серию по совпадению оффсета с полем цели foreach (PaEntry ent in key_index.GetAll()) { object[] v5 = (object[])ent.Get(); long tab_pnt = (long)v5[4]; // указатель на таблицу if (tab_pnt != key_offset) { // заканчивается серия, начинается новая серия if (key_offset != Int64.MaxValue) { // надо закончить предыдущую серию tab_el_ent.offset = key_offset; tab_el_ent.Field(5).Set(inv_beg); tab_el_ent.Field(6).Set(inv_count); } // установим новую серию key_offset = tab_pnt; inv_beg = ent.offset; inv_count = 0; } inv_count++; } // закончим последнюю серию tab_el_ent.offset = key_offset; tab_el_ent.Field(5).Set(inv_beg); tab_el_ent.Field(6).Set(inv_count); }
//public void Load<Tkey>(Func<PaEntry, Tkey> keyProducer) public void Load() { // Маленький массв будет после загрузки пустым indexCellSmall.Clear(); indexCellSmall.Fill(new object[0]); indexCellSmall.Flush(); indexCell.Clear(); indexCell.Fill(new object[0]); foreach (var rec in table.Elements().Where(ent => !(bool)ent.Field(0).Get())) // загрузка всех элементов за исключением уничтоженных { var offset = rec.offset; indexCell.Root.AppendElement(offset); } indexCell.Flush(); if (indexCell.Root.Count() == 0) { return; // потому что следующая операция не пройдет } // Сортировать index_cell специальным образом: значение (long) используется как offset ячейки и там прочитывается нулевое поле indexCell.Root.Sort <FlexIndex <TKey> >(); }
public void Load <Tkey>(Func <PaEntry, Tkey> keyProducer) { index_cell.Clear(); index_cell.Fill(new object[0]); foreach (var rec in table.Elements().Where(ent => (bool)ent.Field(0).Get() == false)) { long offset = rec.offset; index_cell.Root.AppendElement(offset); } index_cell.Flush(); if (index_cell.Root.Count() == 0) { return; // потому что следующая операция не пройдет } // Попробую сортировать index_cell специальным образом: значение (long) используется как offset ячейки и там прочитывается нулевое поле var ptr = table.Element(0); index_cell.Root.SortByKey <Tkey>((object v) => { ptr.offset = (long)v; return(keyProducer(ptr)); }); }