예제 #1
0
        public Mag_Nametable(Stream stream1, Stream stream2)
        {
            // Если стримы пустые, то создаются последовательности с нулем элементов, если непустые, то происходит подключение
            ids  = new UniversalSequence <int>(new PType(PTypeEnumeration.sstring), stream1);
            offs = new UniversalSequence <int>(new PType(PTypeEnumeration.longinteger), stream2);
            int nom = 0;

            ids.Scan((off, ob) =>
            {
                dic.Add((string)ob, nom);
                nom++;
                return(true);
            });
        }
예제 #2
0
        public void CalculateStaticIndex()
        {
            if (dic1 != null)
            {
                dic1 = new Dictionary <int, long>();              // Не используем накопленное содержание
            }
            if (dic2 != null)
            {
                dic2 = new Dictionary <int, long>();
            }
            int ind       = 0;
            int nelements = (int)keyvalue_seq.Count();

            keys_arr = new int[nelements];
            long[] offs_arr = new long[nelements];
            keyvalue_seq.Scan((off, obj) =>
            {
                int key       = (int)((object[])obj)[0];
                keys_arr[ind] = key;
                offs_arr[ind] = off;
                ind++;
                return(true);
            });
            Array.Sort(keys_arr, offs_arr);
            keys.Clear(); //keys.Fill(new object[0]);
            List <int> keys_list = new List <int>();

            offsets.Clear(); //offsets.Fill(new object[0]);
            // Будем убирать повторы
            int  prev_key    = Int32.MaxValue;
            long prev_offset = Int64.MinValue;

            for (int i = 0; i < nelements; i++)
            {
                int  key    = keys_arr[i];
                long offset = offs_arr[i];
                if (key != prev_key)
                {  // Надо сохранить пару, но только если предыдущий ключ не фиктивный
                    if (prev_key != Int32.MaxValue)
                    {
                        keys.AppendElement(prev_key);
                        keys_list.Add(prev_key);
                        offsets.AppendElement(prev_offset);
                    }
                    prev_key    = key;
                    prev_offset = offset;
                }
                else
                {
                    if (offset > prev_offset)
                    {
                        prev_offset = offset;
                    }
                }
            }
            if (nelements > 0)
            {
                keys.AppendElement(prev_key);
                keys_list.Add(prev_key);
                offsets.AppendElement(prev_offset);
            }

            // Доделаем массив ключей
            keys_arr = keys_list.ToArray();
            keys.Flush();
            offsets.Flush();

            // Внешние индексы, если есть
            if (exindexes != null)
            {
                foreach (var exindx in exindexes)
                {
                    //var q = exindx.exkeys;
                    //// long[] offs_arr = new long[nelements];
                    //int[] ext_arr = exindx.exkeys.ElementValues().Cast<int>().ToArray();
                    //int[] pri_arr = exindx.prikeys.ElementValues().Cast<int>().ToArray();
                    //Array.Sort(ext_arr, pri_arr);
                    //exindx.exkeys.Clear(); //exindx.exkeys.Fill(new object[0]);
                    //foreach (int k in ext_arr) exindx.exkeys.AppendElement(k);
                    //exindx.prikeys.Clear(); //exindx.prikeys.Fill(new object[0]);
                    //foreach (int k in pri_arr) exindx.prikeys.AppendElement(k);
                    //exindx.exkeys.Flush();
                    //exindx.prikeys.Flush();
                    long  ne      = exindx.exprikeys.Count();
                    int[] ext_arr = new int[ne];
                    int[] pri_arr = new int[ne];
                    for (int i = 0; i < ne; i++)
                    {
                        object[] ep = (object[])exindx.exprikeys.GetElement(exindx.exprikeys.ElementOffset(i));
                        ext_arr[i] = (int)ep[0];
                        pri_arr[i] = (int)ep[1];
                    }
                    Array.Sort(ext_arr, pri_arr);
                    exindx.exprikeys.Clear();
                    for (int i = 0; i < ne; i++)
                    {
                        exindx.exprikeys.AppendElement(new object[] { ext_arr[i], pri_arr[i] });
                    }
                    exindx.exprikeys.Flush();

                    pri_arr        = null;
                    exindx.key_arr = ext_arr;
                }
            }
        }