示例#1
0
 public PaEntry GetFirstByKey(Tkey key)
 {
     if (table.Count() == 0)
     {
         return(PaEntry.Empty);
     }
     return(GetFirstFromByKey(index_cell, key));
 }
示例#2
0
        public PaEntry GetFirstByKey(TKey key)
        {
            if (table.Count() == 0)
            {
                return(PaEntry.Empty);
            }
            var ent = GetFirstFromByKey(indexCellSmall, key); // сначала из маленького массива

            return(!ent.IsEmpty ? ent : GetFirstFromByKey(indexCell, key));
        }
示例#3
0
        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);
        }
示例#4
0
        // Сортировка по дополнительному индексу. Предполагается, что по первичному индексу сортировка уже произведена
        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;
                }
            }
        }
示例#5
0
        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));
        }
示例#6
0
        // Возвращает первый вход опорной таблицы, для которого сгенерированный ключ совпадает с образцом
        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);
        }