Exemple #1
0
        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);
        }
Exemple #2
0
        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");
            }
        }
Exemple #3
0
 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();
 }
Exemple #4
0
        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);
        }
Exemple #5
0
        //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> >();
        }
Exemple #6
0
        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));
            });
        }